2011-09-26 75 views
4

编程之前,我一直很困惑,但是这个需要蛋糕。基本上,我将该值设置为一个for循环,并在接下来的迭代中更改为下一个循环的值。变量本身的变化

for (int i = 0; i < 2; ++i) 
{ 
    for (int j = 0; j < numWords[i]; ++j) //numWords [0] = 9, numWords [1] = 7 
    { 
     stb[i][j].word = const_cast<char*>(is (j + 1,1).c_str()); //is(int,length[opt]) converts int to string, c_str() returns const char *, but I need char * 
     cout << is(j+1,1) << ' ' << stb[i][j].word << '\n'; 
    } 
} 

for (int i = 0; i < 2; ++i) 
{ 
    for (int j = 0; j < numWords [i]; ++j) 
    { 
     cout << stb[i][j].word << ' '; 
    } 
    cout << '\n'; 
} 

输出:

 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
7 7 7 7 7 7 7 7 7 
7 7 7 7 7 7 7 

我唯一的猜测是现在的东西用const,但它没有意义,为什么它会不断地改变以往所有的数组元素...

+3

你还没有向我们展示is()'。 –

+0

那么,我其实只是找到了原因。首先,is()可以正常工作,但我刚刚了解到,由于字符串不必将每个字符存储在连续的内存位置,只要传递给cstr()的字符串发生更改,从中。去图我花了多少时间:/ – chris

+1

不要使用'const_cast'。永远。 (当你有足够的C++经验知道它什么时候会安全的时候,你会学到更好的技术。) –

回答

3

这非常简单。你的程序有未定义的行为(如果我对is()的假设是正确的)。

is(int, length)按值返回std::string。你可以通过使用c_str()得到一个指向内部结构的指针string。然后该字符串在完整表达式的末尾被破坏。这种破坏会使您从c_str()获得的指针失效。

这意味着你用指向无效内存的指针填充数组。然后您从这些指针读取数组,以打印出数组的内容。从无效内存中读取会导致未定义的行为。

所观察到的行为的可能的解释是这样的:

每个stringis返回重用相同的存储器。在第一个循环中,您从内存中读取的内容在被另一个is调用覆盖之前被读取,因此您会得到正确的值。在第二次循环中,你在从内存中读取数据后,读取数据中的最终值。

+0

这很有道理。现在我的问题是,我所尝试的任何东西都不会按照预期的方式工作。我需要一个char *作为单词。 – chris

+1

@chris - 创建一个单独的'std :: vector'或拥有这些字符串的数组,然后从该数组中的字符串中获取'char *'s。 – Mankarse