返回的局部变量行为的地址[复制](Returning an address of local var

2019-07-31 14:18发布

可能重复:
可以在本地变量的内存是它的范围之外访问?

输入:

#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获得指针的值后变为垃圾?

Answer 1:

当然。 其结果将调试和发布(清洁)之间的差异。 局部变量是EBP-(一些偏移量),如果你看一下组装。 这意味着,高于堆栈,如在“进一步”。

这是返回地址。

通常情况下这将是不变的,如果函数只是返回。 在一些编译器调试版本,它会在目的garbaged以帮助您捕捉悬摆指针错误更快。 现在,printf的调用重用的堆栈传递参数,并为自己的局部变量(它有一些)相同的地址。 他们将被写入到FUNC1返回空地址,从而覆盖不管是你得到的地址指出。



Answer 2:

调用的printf创建一个覆盖以前所占据的位置,一个新的堆栈帧a



文章来源: Returning an address of local variable behaviour [duplicate]