调用函数后堆栈帧会发生什么?我有一个函数返回局部变量的地址 - 我应该能够这样做,还是在返回函数后销毁堆栈帧?这是我的代码 - 我希望得到错误的结果,但我得到了正确的结果。
#include<stdio.h>
#include<stdlib.h>
int* sum(int a,int b)
{
int x=a+b;
return &x;
}
int main()
{
int*a;
int x=5,y=6;
a=sum(x,y);
printf("%d",*a);
return 0;
}
答案 0 :(得分:0)
在这种情况下x
超出范围,它返回的值无效,因此,对它的任何引用都是未定义的行为。当事情超出范围时,就像将地址归还给你不再租房的公寓一样。
关于内存会发生什么,它可能会被覆盖也可能不会被覆盖。没关系。在该范围之外使用x
是有问题的,不应该这样做。实际上,这个函数不能按设计工作,因为它产生的值是无用的。
在这个简单的示例中,当您以完全相同的成本返回int
时,没有理由返回指向int
的指针。
如果你需要返回一个指向在函数中创建的值的指针,你必须动态分配它,这样它就不会超出范围。这也带有隐含的要求,即后续代码拥有该指针并在适当的时候调用free
。
答案 1 :(得分:0)
您永远不应该返回对局部变量的引用。你的长期外部指针肯定会接受该引用,但是在下一个函数调用中要回收(并覆盖)的内存使你的指针指向垃圾。
在您的情况下,只返回一个值而不是引用。