返回本地创建的const char *

时间:2018-06-28 02:25:25

标签: c++ pointers return lifetime

#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(局部变量)被分配了本地创建的字符串文字的地址,但是当函数返回时,y指向的数据是相同的正如x所指出的那样,即使x不在范围之内。

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

2 个答案:

答案 0 :(得分:4)

格式正确,返回的指针有效且没有悬挂;因为string literal(即"abc")具有固定的存储期限,并且存在于程序的整个生命周期中。

  

字符串文字具有静态的存储期限,因此在程序生命周期内存在内存中。

如您所说,当函数返回局部变量x时,该变量将被销毁,但它所指向的字符串文字不会被销毁。

答案 1 :(得分:1)

关于您的功能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为”)

enter image description here

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

char x[] = "abc";的对面是局部变量,该变量超出范围将死亡。