如果我声明 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;
}
&a_ = 0x7ffe7905ed9c
p = (nil)
[ EDIT ] 为了迂腐,“allocated on the stack”应该读作“allocated on通常称为堆栈的东西,如果存在,并且变量实际上是在内存中分配的,而不是例如存储在寄存器中或优化掉"。
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_
(akap
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;
}
&a_ = 0x7ffe7905ed9c
p = (nil)
[ EDIT ] 为了迂腐,“allocated on the stack”应该读作“allocated on通常称为堆栈的东西,如果存在,并且变量实际上是在内存中分配的,而不是例如存储在寄存器中或优化掉"。