C语言中返回局部变量指针的探究

首次编辑: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。一度导致我纠结了很久。

后来才知道,两种方式都是不安全的,只是第二种写法编译器探测不到这个潜在的问题而已。



0

作者:码鸽
链接https://code-pigeon.github.io/blog/html/C语言中返回局部变量指针的探究.html
版权声明:博客所有原创内容(包括但不限于文章、图像等)除特别声明外,均采用CC BY-NC-SA 4.0国际许可协议。任何人均可自由传播,但禁止用于商业用途且必须署名并以相同方式分享。

评论