#include<stdio.h>
int *sample();
int main(void)
{
int *p;
p=sample();
printf("%d",*p);
return 0;
}
int *sample()
{
int *p,x=10;
p=&x;
return p;
}
在上面的代码中,x
是局部变量。当我用gcc编译上面时,我得到了输出:
10
局部变量仅在声明它的函数中存活,并且当控件来自函数时,应该取消分配局部变量。但这不会发生。 它的印刷10?任何人都可以解释这种行为吗?
答案 0 :(得分:4)
虽然在C标准中行为是正式未定义的,但在实践中,记忆中的值会一直存在,直到其他东西覆盖它们为止。
找到更多详情答案 1 :(得分:2)
我修改了你的程序一点点。见下文。
#include<stdio.h>
int *sample();
void donothing ();
int main(void)
{
int *p;
p=sample();
donothing();
printf("in main(), *p = %d\n",*p);
return 0;
}
int *sample()
{
int *p,x=10;
p=&x;
return p;
}
void donothing ()
{
int x[10], y;
y = 17;
return;
}
当我现在运行时,这就是我得到的......
amrith@amrith-vbox:~/so$ ./stack
in main(), *p = 17
amrith@amrith-vbox:~/so$
返回局部变量的地址永远不会安全,因为它通常在堆栈上建立并且可以被覆盖。
答案 2 :(得分:0)
该程序具有未定义的行为。返回局部变量的引用具有不可预测的行为,您只是不幸的是该值仍然存在。
答案 3 :(得分:0)
C中没有垃圾收集。
当x
退出时, sample
,一个局部变量,不再存在
您的案例是未定义的行为。