Possible Duplicate:
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变成了垃圾?
最佳答案
当然。 调试和发布(干净)的结果会有所不同。 如果您查看程序集,则局部变量是 EBP-(某些偏移量)。 这意味着,“HIGHER IN STACK”,如“进一步”。
这是您返回的地址。
通常情况下,如果函数只是返回,它就不会受到影响。在某些编译器的调试版本中,它会被故意丢弃,以帮助您更快地捕获悬空指针错误。现在, printf 调用重用堆栈中的相同地址来传递参数及其自己的局部变量(它有一些)。它们将被写入由 func1 返回清空的地址,从而覆盖您获得的地址所指向的任何内容。
关于c - 返回局部变量行为的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414746/