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

标签 c++ scope

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

相关文章:

c++ - QTextStream 和 Visual Studio 2008 Release模式

c++ - clang++ 和 u16string

scope - Julia 变量范围

c++ - 当 Injected-Class-Name 发生时会发生什么? (C++)

c++ - 使用 Visual Studio 2008 构建 OpenCV 应用程序并从另一台计算机运行它

c++ - 此代码是否正确同步?

c++ - 根据模板参数更改成员类型定义?

C++ 将方法和字段带入外部范围,无需显式引用

php - 无法获取 $_POST 值(php、html)

java - 定义为匿名内部类的 java 事件监听器如何使用封闭类中的变量?