为什么从 C++ 中的函数返回时 char 数组会丢失?
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
变量都是在堆栈上创建的,因此它们都应该在函数结束时销毁。我的问题是,变量 arr
丢失时变量 b
怎么没有丢失?
getInt
和 getString
return 都是一个值。
getInt
returns 一个 int
值为 5。它在调用者中仍然是 5。
getString
return 是指向 arr
的 char *
值。当调用者收到一个指针时,当函数 returns.
时,它指向的东西 arr
不再存在(在 C 标准的计算模型中)
因此,与其说它的含义是问题,不如说是函数 return 编辑的值。数字 5 保留其含义。指向不复存在的事物的指针不保留其意义。
C(并由 C++ 继承)的一个独特且经常令人困惑的特性是,当在表达式中使用数组时,它不被视为值的集合,而是(大多数时候)被视为指向其第一个值的指针element.† 因此,当您 return 来自函数的数组时,您正在 return 获取其第一个元素的地址。
Dereferencing the address of an object with automatic storage duration that is no longer in scope results in undefined behavior.
当您 return 来自函数的值时,该值的副本会 return 发送给调用者。
因此,当您 return 一个整数时,调用者会收到该整数值的副本。
如果值是指针,则复制的值是指针。如果指针指向无效对象,那么如果指针的接收者试图取消引用指针值,则会导致未定义的行为。
† 有3个例外:(1)作为&
的操作数; (2) 作为 sizeof
的操作数; (3) 用于初始化数组的字符串文字。在C++中,还有其他例外: (4) 作为decltype
的操作数; (5) 作为引用参数的函数实参; (6) 一个对象来初始化一个引用变量; ...可能还有什么我忘记了...
我知道,如果我们在函数内声明变量而不为它们分配内存,它们将在函数完成其工作后丢失。
以下代码打印:
(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
变量都是在堆栈上创建的,因此它们都应该在函数结束时销毁。我的问题是,变量 arr
丢失时变量 b
怎么没有丢失?
getInt
和 getString
return 都是一个值。
getInt
returns 一个 int
值为 5。它在调用者中仍然是 5。
getString
return 是指向 arr
的 char *
值。当调用者收到一个指针时,当函数 returns.
arr
不再存在(在 C 标准的计算模型中)
因此,与其说它的含义是问题,不如说是函数 return 编辑的值。数字 5 保留其含义。指向不复存在的事物的指针不保留其意义。
C(并由 C++ 继承)的一个独特且经常令人困惑的特性是,当在表达式中使用数组时,它不被视为值的集合,而是(大多数时候)被视为指向其第一个值的指针element.† 因此,当您 return 来自函数的数组时,您正在 return 获取其第一个元素的地址。
Dereferencing the address of an object with automatic storage duration that is no longer in scope results in undefined behavior.
当您 return 来自函数的值时,该值的副本会 return 发送给调用者。
因此,当您 return 一个整数时,调用者会收到该整数值的副本。
如果值是指针,则复制的值是指针。如果指针指向无效对象,那么如果指针的接收者试图取消引用指针值,则会导致未定义的行为。
† 有3个例外:(1)作为&
的操作数; (2) 作为 sizeof
的操作数; (3) 用于初始化数组的字符串文字。在C++中,还有其他例外: (4) 作为decltype
的操作数; (5) 作为引用参数的函数实参; (6) 一个对象来初始化一个引用变量; ...可能还有什么我忘记了...