从函数分配的字符串文字 return const char * 是否安全?

Is it safe to return const char * that was assigned string literal from function?

我知道这是安全的...

const char *get_str_literal() {
    return "I literally can't even";
}

但这是吗?

const char *get_str_literal() {
    const char *str = "I literally can't even";
    return str;
}

如果不是,为什么?

编辑:下面的片段与上面的第二个代码片段有何不同?

const char *get_str_literal() {
    const char str[] = "I literally can't even";
    return str;
}

字符串文字的内容是否被复制到自动数组存储中?会发生什么?

在你的第二个例子中:

const char *get_str_literal() {
    const char *str = "I literally can't even";
    return str;
}

str是一个指向字符串字面量的指针,具有静态存储期。因此,当调用函数中恢复执行时,返回的指针仍将指向某些东西,即字符串文字。

在你的最后一个例子中:

const char *get_str_literal() {
    const char str[] = "I literally can't even";
    return str;
}

字符数组 str[] 初始化 为字符串文字。初始化后,str[] 是一个 char 数组,其中包含字符串文字的字符,直至并包括 '[=16=]' 终止符。当在return语句中遇到str时,将其转换为指向const char的指针,返回给调用函数。但是,由于 str[] 具有自动存储持续时间,它的生命周期将结束并且指针将变得不确定,从而导致未定义的行为。