【发布时间】:2020-03-06 01:02:40
【问题描述】:
我知道,如果我们在函数中声明变量而不为它们分配内存,那么在函数完成其工作后它们将丢失。
以下代码打印:
(null)
5
char* getString()
{
char arr[] = "SomeText";
return arr;
}
int getInt()
{
int b = 5;
return b;
}
int main()
{
printf("%s", getString());
printf("\n");
printf("%d", getInt());
return 0;
}
arr 和b 变量都是在堆栈上创建的,所以它们都应该在函数结束时被销毁。我的问题是,为什么变量b 没有丢失而变量arr 丢失了?
【问题讨论】:
-
未定义的行为。任何事情都有可能发生。
-
局部变量
b已丢失,但其值由函数返回。如果您将 指针 返回到b,则情况与arr相同。 -
据我了解,变量 b 使用的内存可以被任何其他东西使用。如果发生这种情况,我也会失去变量 b。 @pmg 为什么值不会丢失?
-
假设在函数之间传递“事物”是通过信封完成的。当
getInt()到达语句return b;时,它会将当时包含在变量b中的值放入信封中。函数getString()将类似0xdeadbeef的东西放入信封内(“腐烂的”arr)。 -
两个函数都返回值。
getInt()返回一个整数值,getString()返回一个char*值。不幸的是,返回的char*值是超出范围且不再存在的数组的地址。
标签: c++ arrays callstack char-pointer