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-(有些偏移)。
这意味着“在堆栈中更高”,如“更多”中一样。
这是您返回的地址。
通常,如果函数刚刚返回,它将保持不变。在某些编译器上进行调试时,将有意将其丢弃,以帮助您更快地捕获悬空指针错误。现在,printf调用将重用堆栈中的相同地址以传递参数并传递其自身的局部变量(有一些局部变量)。它们将被写入func1 return清空的地址,从而覆盖您获得的地址所指向的内容。
关于c - 返回一个局部变量行为的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12414746/