我不明白为什么以下C代码有效(打印' 53')。我认为只要foo()退出, int a 就会被放置在堆栈上并被擦掉。如果编译器将 int 放在堆上,有没有办法告诉它不要?
#include "stdio.h"
int * foo()
{
int a = 53;
int * b = &a;
return b;
}
int main(void)
{
int * c = foo();
printf("%d\n",*c);
return 0;
}
答案 0 :(得分:1)
整数a
存储在堆栈中。这样做的原因是函数foo
返回a
的地址,函数main
取消引用此地址,以便在a
地址的内容之前打印它覆盖。在这种情况下,该程序偶然起作用。如果您希望在计划的整个生命周期中保留a
的值,您需要将static
限定符应用于a
的声明,或者分配堆上a
。