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


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

是否在堆栈上分配了a_(此处也称为p(?

的内存分配在哪里

<blockquote\
int a_ = 5;

>为a_、分配自动存储

int* p = a();

还为p分配了自动存储

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


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

是否在堆栈上分配了a_(此处也称为p(?

a_在堆栈上分配。变量p也在堆栈上分配。p的指针值不需要特别指向任何地方,因为取消引用它会导致UB(例如,请参阅局部变量的内存是否可以在其范围之外访问?(。

至少有一个实现(gcc 10.2,默认选项(编译a()以返回nullptr,这使得p(的目标(被分配到哪里的问题变得毫无意义。

代码:

#include <stdio.h>
int* a() {
int a_ = 5;
printf("&a_ = %pn", &a_);
return &a_;
}
int main() {
int* p = a();
printf(" p  = %pn", p);
return 0;
}

输出:

&a_ = 0x7ffe7905ed9c
p  = (nil)

编辑分配在堆栈上";应读作">分配在通常称为堆栈的东西上,如果存在堆栈,并且变量实际上是分配在内存中的,而不是存储在寄存器中或优化掉";。

最新更新