请参阅下面的代码示例。 函数中的函数fun_ret_loc_ptr()
返回一个警告:“函数返回局部变量的地址”。另一方面,函数fun_ret_loc_var()
中的语句return a
不这样做。为什么gcc在返回指向局部变量的指针时抛出警告,而不是在返回局部变量时抛出警告?
#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
”语句的功能角度来看,为什么会出现这种差异?
如果函数返回值,主函数如何知道返回值返回哪个位置? – Abhijeet
@Abhijeet:在返回期间,函数将其返回值推送到堆栈。然后调用者函数从堆栈中检索(例如:弹出)它。 – jweyrich
@jweyrich复制返回值的位置取决于正在使用的调用约定。它可能会被传回寄存器或跨越多个寄存器。 – James