5

我以前在编程时一直很困惑,但是这个很重要。基本上,我在一个 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 的东西,但它为什么会不断改变所有以前的数组元素是没有意义的......

4

1 回答 1

3

这很简单。您的程序具有未定义的行为(如果我的假设is()是正确的)。

is(int, length)按值返回std::stringstring通过使用,您可以获得指向其中某个内部结构的指针c_str()然后在full-expression的末尾销毁该字符串。这种破坏使您从中获得的指针无效c_str()

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

观察到的行为的一个可能解释是:

返回的每个都string重用is相同的内存。在第一个循环中,您在内存被另一个调用覆盖之前从内存中读取is,因此您获得了正确的值。在第二个循环中,您在内存被覆盖后从内存中读取,因此您获得了数组中的最终值。

于 2011-09-26T05:24:12.970 回答