为什么 char 数组在从 C++ 中的函数返回时会丢失?

Why do char arrays get lost when returning from a function in C++?

本文关键字:返回 函数 数组 char C++ 为什么      更新时间:2023-10-16

我知道,如果我们在函数内声明变量而不为它们分配内存,那么在函数完成其工作后,它们将丢失。

打印以下代码:

(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; 
} 

arrb变量都是在堆栈上创建的,因此当函数结束时,它们都应该被销毁。我的问题是,为什么变量b不会丢失而变量arr丢失?

C 的一个独特且经常令人困惑的特征(由 C++ 继承)是,在表达式中使用数组时不被视为值的集合,而是(大多数情况下)被视为指向其第一个元素的指针。因此,当您从函数返回数组时,您将返回其第一个元素的地址。

取消引用具有不再在范围内的自动存储持续时间的对象的地址会导致未定义的行为。

从函数返回值时,会将值的副本返回给调用方。

因此,当您返回整数时,调用方会收到该整数值的副本。

如果值是指针,则复制的值是指针。如果指针指向无效对象,则如果指针的接收方尝试取消引用指针值,则会导致未定义的行为。


有 3 个例外:(1) 作为&的操作数;(2)作为sizeof的操作数;(3) 用于初始化数组的字符串文本。在C++中,还有其他例外:(4)作为decltype的操作数;(5)作为引用参数的函数参数;(6) 初始化引用变量的对象;...可能是我忘记了别的东西...

getIntgetString都返回一个值。

getInt返回int值 5。它在调用方中仍为 5。

getString返回一个指向arrchar *值。当调用方收到指针时,当函数返回时,它指向的东西arr不再存在(在 C 标准的计算模型中)。

因此,问题不在于函数返回的值,而在于它的含义。数字 5 保留了它的含义。指向不复存在的事物的指针不会保留其含义。