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

时间:2017-02-02 04:16:22

标签: c pointers c-strings

我明白这是安全的......

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;
}

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

1 个答案:

答案 0 :(得分:3)

在你的第二个例子中:

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数组,包含字符串文字的字符,包括'\0'终止符。在str语句中遇到return时,会将其转换为指向const char的指针,该指针将返回到调用函数。但是,由于str[]具有自动存储持续时间,因此它的生命周期将结束,指针将变为不确定,从而导致未定义的行为。