返回本地创建的 const char*

Returning a locally created const char*

#include <iostream>


const char* fun()
{
    const char* x = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}


int main(int arc, char** argv)
{
    const char* y = fun();
    std::cout << "y = " << y << "\n";
    return 0;
}

运行 这在我的机器上给出:

x = abc

y = abc

fun()中,x(局部变量)被赋值为本地创建的字符串字面量的地址,而函数returns时,[=]指向的数据14=] 与 x 指向的相同,即使 x 超出范围。

有人可以详细解释这里发生了什么吗?

这是合式的,返回的指针是有效的,没有悬挂;因为string literal(即"abc")是静态存储的,存在于程序的整个生命周期中。

String literals have static storage duration, and thus exist in memory for the life of the program.

正如您所说,当函数 returns 局部变量 x 被销毁时,但它指向的字符串文字没有被销毁。

至于你的功能fun

const char* fun(){
    const char* x = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}// the pointer returns but it's content still alive, because it points to string literal

如果您将函数 fun 更改为以下内容:

const char* fun(){
    char x[] = "abc";
    std::cout << "x = " << x << "\n";
    return x;
}// the pointer returns but it's content died

然后:

const char* y = fun();
std::cout << "y = " << y << "\n"; 

按预期输出(y 是 ''):

因为上面的const char* x = "abc";不是局部变量,所以是string literal,它有静态存储期,存在于程序的整个生命周期。

对面的 char x[] = "abc"; 是局部变量,当超出作用域时会死亡。