Почему эта переменная стека не перезаписывается, хотя она выходит за рамки? - PullRequest
0 голосов
/ 23 марта 2020

AFAIK, переменные, объявленные в стеке, живут только до тех пор, пока не закончится текущая область, то есть, в основном, до следующего }. Однако давайте возьмем этот пример:

int main() {
    int* ptrOne;
    {
        int intOne = 1;
        ptrOne = &intOne;
    }
    int intTwo = 9;

    std::cout << *ptrOne;
}

Когда объявлено intTwo, intOne уже выходит за рамки. Это больше не доступно и должно быть перезаписано. Тем не менее, cout все еще работает и выдает 1. В представлении памяти я вижу, что 1 все еще существует, с 9 записанными за ним несколько байтов. Почему? (Я использую Visual Studio 2019 с MSV C)

1 Ответ

5 голосов
/ 23 марта 2020

Он больше недоступен и, следовательно, должен быть перезаписан.

Неправильно, правильный оператор - it is no longer accessible and so the program has undefined behaviour. Вы не можете рассуждать о программах с неопределенным поведением, они могут делать то, что им нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...