这是一段 C++ 代码,显示了一些非常奇特的行为。谁能告诉我为什么strB可以打印出这些东西?
char* strA()
{
char str[] = "hello word";
return str;
}
char* strB()
{
char* str = "hello word";
return str;
}
int main()
{
cout<<strA()<<endl;
cout<<strB()<<endl;
}
最佳答案
为什么 strB()
有效?
字符串文字(例如 "a string literal"
)具有静态存储持续时间。这意味着它的生命周期跨越了程序执行的持续时间。这是可以做到的,因为编译器知道您将在程序中使用的每个字符串文字,因此它可以将它们的数据直接存储到已编译可执行文件的数据部分(例如:https://godbolt.org/z/7nErYe)
当您获得指向它的指针时,该指针可以自由传递(包括从函数返回)并取消引用,因为它指向的对象始终处于事件状态。
为什么 strA()
不起作用?
但是,从字符串文字初始化一个 char 数组会复制字符串文字的内容。创建的数组是与原始字符串文字不同的对象。如果这样的数组是局部变量(即具有自动存储持续时间),如在您的 strA()
中,则它会在函数返回后被销毁。
当您从 strA()
返回时,由于返回类型是 char*
执行“数组到指针转换”,创建一个指向数组的第一个元素。但是,由于数组在函数返回时被销毁,返回的指针变得无效。您不应尝试取消引用此类指针(并避免首先创建它们)。
关于c++ - 为什么我们可以从函数返回 char*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66288233/