[英]Returning an address of local variable behaviour [duplicate]
可能重复:
可以在其范围之外访问局部变量的内存吗?
输入:
#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变为垃圾?
调用printf会创建一个新的堆栈帧,覆盖先前由a
占用的位置。
当然。 调试和发布(干净)之间的结果会有所不同。 如果查看程序集,局部变量是EBP-(某些偏移量)。 这意味着,更高的堆叠,如“更进一步”。
这是您返回的地址。
通常,如果函数返回,它将不受影响。 在一些编译器的调试版本中,它会被故意用来帮助你更快地捕获悬空指针错误。 现在,printf调用重用堆栈中的相同地址来传递参数和它自己的局部变量(它有一些)。 它们将被写入由func1返回清空的地址,从而覆盖您获得的地址所指向的任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.