gpt4 book ai didi

c++ - 为什么我们可以从函数返回 char*?

转载 作者:行者123 更新时间:2023-12-05 08:30:07 26 4
gpt4 key购买 nike

这是一段 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com