Изменения значения переменной сами - PullRequest
4 голосов
/ 26 сентября 2011

Я был довольно смущен, когда программировал раньше, но этот снимает с ума. В основном я устанавливаю значение в цикле 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

Мое единственное предположение сейчас - что-то с константой, но не имеет смысла, почему он будет продолжать изменять все предыдущие элементы массива ...

1 Ответ

3 голосов
/ 26 сентября 2011

Это довольно просто. Ваша программа имеет неопределенное поведение (если мои предположения о is() верны).

is(int, length) возвращает std::string по значению. Вы получаете указатель на некоторую внутреннюю структуру в этом string, используя c_str(). Эта строка затем уничтожается в конце полного выражения . Это уничтожение делает недействительными указатели, которые вы получили от c_str().

Это означает, что вы заполняете массив указателями на недопустимую память. Затем вы читаете из этих указателей, чтобы распечатать содержимое массива. Чтение из недействительной памяти приводит к неопределенному поведению.

Возможное объяснение наблюдаемого поведения таково:

Каждый string, возвращаемый is, повторно использует одну и ту же память. В первом цикле вы читаете из памяти, прежде чем она будет перезаписана другим вызовом is, и вы получите правильное значение. Во втором цикле вы читаете из памяти после того, как она была перезаписана, и, таким образом, вы получаете окончательное значение в массиве.

...