为什么 char 数组在从 C++ 中的函数返回时会丢失?
Why do char arrays get lost when returning from a function in C++?
我知道,如果我们在函数内声明变量而不为它们分配内存,那么在函数完成其工作后,它们将丢失。
打印以下代码:
(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
丢失?
C 的一个独特且经常令人困惑的特征(由 C++ 继承)是,在表达式中使用数组时不被视为值的集合,而是(大多数情况下)被视为指向其第一个元素的指针。†因此,当您从函数返回数组时,您将返回其第一个元素的地址。
取消引用具有不再在范围内的自动存储持续时间的对象的地址会导致未定义的行为。
从函数返回值时,会将值的副本返回给调用方。
因此,当您返回整数时,调用方会收到该整数值的副本。
如果值是指针,则复制的值是指针。如果指针指向无效对象,则如果指针的接收方尝试取消引用指针值,则会导致未定义的行为。
†
有 3 个例外:(1) 作为&
的操作数;(2)作为sizeof
的操作数;(3) 用于初始化数组的字符串文本。在C++中,还有其他例外:(4)作为decltype
的操作数;(5)作为引用参数的函数参数;(6) 初始化引用变量的对象;...可能是我忘记了别的东西...
getInt
和getString
都返回一个值。
getInt
返回int
值 5。它在调用方中仍为 5。
getString
返回一个指向arr
的char *
值。当调用方收到指针时,当函数返回时,它指向的东西arr
不再存在(在 C 标准的计算模型中)。
因此,问题不在于函数返回的值,而在于它的含义。数字 5 保留了它的含义。指向不复存在的事物的指针不会保留其含义。
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数