0
#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

4 回答 4

4

虽然行为在 C 标准中没有正式定义,但实际上内存中的值会一直存在,直到有其他东西覆盖它们。

更多细节可以在为什么我的数组中有我没有分配的值?

于 2013-08-15T10:26:43.023 回答
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$ 

返回局部变量的地址永远不会安全,因为它通常建立在堆栈上并且可以被覆盖。

于 2013-08-15T10:41:10.170 回答
0

该程序具有未定义的行为。返回局部变量的引用具有不可预测的行为,您很不幸该值仍然存在。

于 2013-08-15T10:12:17.213 回答
0

C中没有垃圾收集。

x, 局部变量,sample退出时不存在

您的情况是未定义的行为。

于 2013-08-15T10:24:15.697 回答