【发布时间】:2012-01-01 07:53:34
【问题描述】:
请参阅下面的代码示例。
函数fun_ret_loc_ptr() 中的语句return (&i) 返回警告:“函数返回局部变量的地址”。另一方面,函数fun_ret_loc_var() 中的语句return a 没有这样做。
#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() 的堆栈帧的一部分。一旦此函数返回堆栈帧(激活记录)将被销毁。同样的事情应该适用于函数fun_ret_loc_var() 中的变量'a' (return a;)。即使返回了,但在main中使用时,'a'对应的内存也会死掉。
从“return”语句的功能来看,为什么会出现这种差异?
【问题讨论】:
标签: c gcc compiler-construction operating-system