首次编辑:24/3/19/20:26
最后编辑:24/3/19/
学汇编的时候,知道了在函数结束之后,函数栈应该是会被清理的。由于局部变量位于函数栈中,所以理论上一个函数若返回它的局部变量的地址是不可行的,这个地址中的数据会被清理。
所以如果如下定义一个函数会发生警告:
void *test(){
int x;
x = 3;
return &x;
}
// warning: function returns address of local variable [-Wreturn-local-addr]
然而神奇的是,如果我像下面这样写,警告就消失了:
void *test(){
int x;
x = 3;
int *p = &x;
return p;
}
而如果再在main函数当中输出*p
,也会发现确实等于3。一度导致我纠结了很久。
后来才知道,两种方式都是不安全的,只是第二种写法编译器探测不到这个潜在的问题而已。