我想了解C中的堆栈帧,因此我编写了一个简单的C代码来分析堆栈帧。了解堆栈帧C
首先在FUN1的()返回一个被初始化为10到PTR这导致了警告,但没关系......如果我现在打印* PTR的值,它打印的局部变量的地址10,即使这没关系...
接下来fun2()返回一个局部变量的地址,它甚至没有被初始化,如果我尝试打印* ptr的值,现在它打印10,无论我是否返回a或b的地址...
要理解这里实际发生的事情,我使用了gdb。用gdb ,我开始一步一步的调试,当我到达行“回&一个”在FUN2(),我试图打印B的地址,打印& b但它印 无法采取不是左值的“b”的地址。
,当我尝试打印的地址我不明白,打印&一个它打印精美绝伦,那么为什么不解决B的。 * a为什么不是一个左值?
# include <stdio.h>
int * fun1() {
int a = 10;
return &a;
}
int * fun2()
{
int a;
int b;
return &a; // return &b;
}
int main()
{
int *ptr;
ptr = fun1();
ptr = fun2();
printf ("*ptr = %d, fun2() called...\n", *ptr);
return 0;
}
http://stackoverflow.com/a/18479996/1814023 –
你调用未定义的行为。不能保证结果会有任何意义或做到您期望的堆栈布局。标准的夸张之处在于,该程序允许[恶魔](http://www.catb.org/jargon/html/N/nasal-demons.html)飞出你的鼻子。 – user2357112
很幸运,打印'* ptr'打印10;它肯定不能保证这么做(你正在调用未定义的行为)。但你真的应该显示所有的代码。在代码中,编译器可能会将'b'作为一个未使用的变量,因此它没有位置,因此您无法获取它的地址。以某种方式在代码中使用'b',你就可以打印出来。请不要报告“类似的东西”;确切地说,并且准确地报告调试器说的内容。 –