返回本地创建的 const char*

Posted

技术标签:

【中文标题】返回本地创建的 const char*【英文标题】:Returning a locally created const char* 【发布时间】:2018-12-07 00:02:31 【问题描述】:
#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指向的数据与@指向的数据相同987654326@ 即使x 超出范围。

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

【问题讨论】:

你缺少的一点是一个函数可能总是返回一个它自己类型的值。指针的警告是函数返回后它们指向的内容必须仍然存在。 @songuyanyao 解释如下。 【参考方案1】:

这是格式正确的,返回的指针是有效的并且没有悬空;因为string literal(即"abc")具有静态存储时长,并且存在于程序的整个生命周期中。

字符串字面量具有静态存储持续时间,因此在程序的整个生命周期内都存在于内存中。

正如你所说,当函数返回局部变量 x 时,它会被破坏,但它指向的字符串文字不会。

【讨论】:

【参考方案2】:

至于你的功能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"; 是局部变量,当超出范围时会死掉。

【讨论】:

你只说对了 1/2。不管是char x[] 还是char *x,重要的是"abc";"abc" 是在 .rodata(只读)数据段中创建的 sting literal。无论你如何声明xreturn x 都会返回一个指针,该指针包含文字中第一个字符的地址。 我只是举个例子。为了更好地理解。 好的,声明 "On 相反 char x[] = "abc"; 是局部变量,超出范围时会死掉。" 不清楚。 (看来您对 "On 相反" 的使用是对 "Inapposite" 的尝试,请参阅Merriam-Wester) 对于具有未定义行为的程序没有“预期”。任何事情都可能发生,包括与正确程序完全相同的工作。我会说类似“毫不奇怪,这个程序的行为不同:”。

以上是关于返回本地创建的 const char*的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以从 char * const 值创建 char * 向量?

Skia 如何使用 SkTypeface* CreateFromFile(const char path[]) 从资产创建字体;

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

模板类 char*,函数 const char* 的返回类型?

错误:无法使用“const char [34]”类型的左值初始化“const char”类型的返回对象

C++ 函数形参里的const char作为返回值问题