如果我声明 a=5 然后 return &a,内存分配在哪里?

Where is the memory allocated if I declare a=5 then return &a?

int* a() {
  int a_ = 5;
  return &a_;
}

int main() {
  int* p = a();
  return 0;
}

a_(这里又名p)是在栈上分配的吗?

Where is the memory allocated

int a_ = 5;

已为 a_

分配自动存储空间
int* p = a();

自动存储也分配给 p

请注意,在 a 返回后,为 a_ 分配的存储持续时间已结束,因此 a 返回的指针无效。


这是从 C++ 和抽象机的角度来看的。从编译器/语言实现的角度来看,在这种情况下根本不需要分配内存,因为没有可观察到的行为取决于为变量分配的内存。

Is a_ (aka p here) allocated on the stack?

a_ 分配在栈上。变量 p 也分配在堆栈上。 p 的指针值不需要特别指向任何地方,因为取消引用它会导致 UB (see Can a local variable's memory be accessed outside its scope? 例如)。

至少一个实现(gcc 10.2,默认选项)将 a() 编译为 return nullptr,这使得 [=13= 的目标(目标)] 的问题变得毫无意义] 已分配。

代码:

#include <stdio.h>

int* a() {
  int a_ = 5;
  printf("&a_ = %p\n", &a_);
  return &a_;
}

int main() {
  int* p = a();
  printf(" p  = %p\n", p);
  return 0;
}

Output:

&a_ = 0x7ffe7905ed9c
 p  = (nil)

[ EDIT ] 为了迂腐,“allocated on the stack”应该读作“allocated on通常称为堆栈的东西,如果存在,并且变量实际上是在内存中分配的,而不是例如存储在寄存器中或优化掉"。