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