Пожалуйста, посмотрите пример кода ниже.Оператор return (&i)
в функции fun_ret_loc_ptr()
возвращает предупреждение: «функция возвращает адрес локальной переменной».С другой стороны, оператор return a
в функции fun_ret_loc_var()
не делает этого.
#include <stdio.h>
int* fun_ret_loc_ptr()
{
int i = 10;
return (&i);
}
int fun_ret_loc_var()
{
int a = 20;
return a;
}
int main()
{
printf("val frm local ptr = %d\n", *fun_ret_loc_ptr());
printf("val frm local var = %d\n", fun_ret_loc_var());
}
Я понимаю, что в первой функции возвращенный адрес (return (&i);
) ссылается на область памяти, котораябыл частью стекового фрейма, соответствующего функции fun_ret_loc_ptr()
.Как только эта функция вернула, стековый фрейм (запись активации) будет уничтожен.То же самое должно быть применимо к переменной 'a' (return a;
) в функции fun_ret_loc_var()
.Даже если он возвращается, когда он используется в main, память, соответствующая 'a', умерла бы.
С точки зрения функциональности оператора "return
", почему возникает это различие?