返回局部变量行为的地址

时间:2012-09-13 21:02:59

标签: c pointers scope undefined-behavior local-variables

  

可能重复:
  Can a local variable's memory be accessed outside its scope?

输入:

#include <stdlib.h>
#include <stdio.h>
int func2(void);
int* func1(void);

int func2(void)
{
    int* b;
    b = func1();
    printf("%d", *b);
    printf("%d", *b);
    printf("%d", *b);
}

int* func1()
{
    int a = 13;
    return &a;
}

int main()
{
    func2();
}

输出:

13 -1077824828 -1077824828

有人可以解释堆栈和操作系统中发生的事情吗?获取指针值后,为什么结果从13变为垃圾?

2 个答案:

答案 0 :(得分:1)

调用printf会创建一个新的堆栈帧,覆盖先前由a占用的位置。

答案 1 :(得分:1)

不确定。 调试和发布(干净)之间的结果会有所不同。 如果查看程序集,局部变量是EBP-(某些偏移量)。 这意味着,更高的堆叠,如“进一步”。

这是您返回的地址。

通常,如果函数返回,它将不受影响。在一些编译器的调试版本中,它会被故意用来帮助你更快地捕获悬空指针错误。现在,printf调用重用堆栈中的相同地址来传递参数和它自己的局部变量(它有一些)。它们将被写入由func1返回清空的地址,从而覆盖您获得的地址指向的任何内容。