编译器是否在堆上放置内存?

时间:2017-02-13 19:42:25

标签: c memory

我不明白为什么以下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;
}

1 个答案:

答案 0 :(得分:1)

整数a存储在堆栈中。这样做的原因是函数foo返回a的地址,函数main取消引用此地址,以便在a地址的内容之前打印它覆盖。在这种情况下,该程序偶然起作用。如果您希望在计划的整个生命周期中保留a的值,您需要将static限定符应用于a的声明,或者分配堆上a