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