当控制失效时,为什么局部变量值仍然存在

时间:2013-08-15 10:10:49

标签: c pointers

#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?任何人都可以解释这种行为吗?

4 个答案:

答案 0 :(得分:4)

虽然在C标准中行为是正式未定义的,但在实践中,记忆中的值会一直存在,直到其他东西覆盖它们为止。

可在Why do I have values in my array that I didn't assign?

找到更多详情

答案 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,一个局部变量,不再存在

您的案例是未定义的行为。