Указатели и область видимости переменных.

С++

Простейший пример:

int* fn()
{
int nValue;
int* pnValue = &nValue;
cout << "Адрес: " << pnValue << endl;
cout << "Значение: " << nValue << endl;
return pnValue;
}

int main()
{
setlocale(0,"");

int* nAddress = fn();
*nAddress = 10;
fn ();

system("pause");
}

Насколько я знаю в момент возврата в функцию main () переменная nValue выходит из области видимости
и уничтожаются. Для меня остается загадкой почему данный код работает без ошибок
Ответы:
Скомпилируйте проэкт в режиме компиляции Debug и будет материться при исполнении. Работать правильно (осмысленно) это не должно, т.к. полученный из функции указатель указывает на то место в стэке где был nValue, то есть чуть-чуть впереди текущего значения sp на этот момент. Да, стэк еще не перезаписался и поэтому там всё еще 10.
Если вы после возврата из функции определите еще пяток long-ов то будет попадать на один из них.
Насколько я понимаю, вы объявили переменную с типом "указатель на целое", поместили в неё некий адрес и поместили по этому адресу значение. Потом значение ячейки памяти по этому адресу вывели.
Просто вы фактически работаете не с автоматической переменной (которая создаётся на стеке), а с кучей. А то, что локальная переменная создаётся вновь по тому же адресу — случайность, не более. Попробуйте прямо перед вторым вызовом fn() немножко попортить стек (я вызвал printf ("%s, %s\n", "Test", "test");) —убедитесь.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.