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/

10-11 22:40
查看更多