我正在试图理解C语言中的栈帧,所以我编写了一个简单的C代码来分析栈帧。
首先,fun1()返回一个本地变量的地址,该变量被初始化为10并赋值给ptr。虽然会出现警告,但这没关系......如果我现在打印*ptr的值,它会打印10,这也没问题......
接下来,fun2()返回一个未初始化的本地变量的地址。无论我是返回a还是b的地址,如果我尝试打印*ptr的值,它都会打印10,这就很奇怪了......
为了理解实际发生了什么,我使用了gdb。使用gdb,我逐步调试,当我到达fun2()中的"return &a"一行时,我尝试打印b的地址,print &b,但它打印了Can't take address of "b" which isn't an lvalue. 我不明白为什么当我尝试打印a的地址print &a, 它完全正常地打印,但为什么不能打印b的地址。 * 为什么b不是lvalue而a是?
首先,fun1()返回一个本地变量的地址,该变量被初始化为10并赋值给ptr。虽然会出现警告,但这没关系......如果我现在打印*ptr的值,它会打印10,这也没问题......
接下来,fun2()返回一个未初始化的本地变量的地址。无论我是返回a还是b的地址,如果我尝试打印*ptr的值,它都会打印10,这就很奇怪了......
为了理解实际发生了什么,我使用了gdb。使用gdb,我逐步调试,当我到达fun2()中的"return &a"一行时,我尝试打印b的地址,print &b,但它打印了Can't take address of "b" which isn't an lvalue. 我不明白为什么当我尝试打印a的地址print &a, 它完全正常地打印,但为什么不能打印b的地址。 * 为什么b不是lvalue而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;
}
*ptr
显示为10;但这并不是保证的(你触发了未定义行为)。 但你真的应该展示所有的代码。在代码中,编译器可能会将b
作为一个未使用的变量删除,因此它没有位置,因此无法取其地址。在代码中以某种方式使用b
,然后你就可以打印它了。而且,请不要报告“类似于”;要准确,并报告调试器确切的消息。 - Jonathan Leffler