c - 返回局部变量行为的地址

标签 c pointers scope undefined-behavior local-variables

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/

相关文章:

c - while 循环不断重复

c - 将指向同类型结构成员的结构的指针分配给指向同类型结构的另一个指针

c - 返回指向c中指针的指针

javascript - 多次异步调用后回调?

Javascript - 在函数的外部范围内访问变量有多昂贵?

python - Python 类中的作用域

c - Toom-Cook乘法算法实现

C代码问题

c++ - 在 dlsym 之后调用 dlclose 是否安全

c++ - 为什么不能将 *pointer+offset 用作左值? ("error: non-lvalue in assignment")