Страницы

Поиск по вопросам

понедельник, 10 июня 2019 г.

Возврат указателя на локальную переменную C++

Есть два варианта функции. Почему не работает первый - понятно, но почему тогда срабатывает второй вариант?
Первый:
int* f() { int b = 10; return &b; }
Второй:
int* f() { int b = 10; int* a = &b; return a; }


Ответ

Окей, в вашем вопросе на самом деле несколько вопросов.
Во-первых, ваш код, оба его варианта, очевидно неверен, так как локальные переменные умирают вместе с фреймом стека функции, в которой они определены.
Почему первый вариант не компилируется? Компилятор, очевидно, видит, что вы возвращаете указатель на локальную переменную, и выдаёт ошибку (или, скорее всего, предупреждение).
Почему же тогда второй вариант компилируется? Дело в том, что компилятор не обязан ловить вас за руку каждый раз, когда вы совершаете ошибку. Он не будет рассматривать то, откуда пришли значения во всех переменных, которые вы возвращаете. Если в первом случае он вам помог (потому что это было легко), то во втором он просто решил этого не делать (потому что ему пришлось бы анализировать, откуда пришло значение переменной a). C++ — язык для взрослых, он считает, что программист читал документацию, понимает, что он делает, и компилятор не надоедает программисту излишними предупреждениями.
Да, а почему второй вариант работает? А случайно. У вас в стеке случайно ничего не затёрло переменную, расположенную в ничьей памяти. Вот эту самую ничью память случайно никто не забрал. А мог забрать в любой момент. Просто не делайте так, иначе никаких гарантий нормальной работы программы нет.
Если делать по правилам, программа будет работать. Если делать не по правилам, она может работать, а может и нет.

Комментариев нет:

Отправить комментарий