0

可能重复:
可以在其范围之外访问局部变量的内存吗?

输入:

#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 变成垃圾?

4

2 回答 2

1

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

这是您返回的地址。

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

于 2012-09-13T21:06:15.920 回答
1

调用 printf 会创建一个新的堆栈帧,它会覆盖之前由a.

于 2012-09-13T21:05:57.580 回答