我试图理解 C 中的堆栈帧,所以我编写了一个简单的 C 代码来分析堆栈帧。
首先,fun1() 返回一个局部变量的地址,该变量初始化为 10 到 ptr,这会导致警告,但没关系......如果我现在打印 *ptr 的值,它会打印 10,即使这样也没关系.. .
接下来 fun2() 返回一个甚至没有初始化的局部变量的地址,如果我现在尝试打印 *ptr 的值,无论我返回的是 a 还是 b 的地址,它都会打印 10 ...
为了了解这里实际发生了什么,我使用了 gdb。使用 gdb,我开始逐步调试,当我到达 fun2() 中的“ return &a ”行时,我尝试打印 b 的地址,打印 &b但它打印了 Can't take address of “b” which is not一个左值。
我不明白当我尝试打印 a 的地址时,打印 &a它打印得非常好,那么为什么不打印 b 的地址。* 为什么当 a 是左值时 b 不是左值?
# 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;
}