从函数分配的字符串文字 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[]
具有自动存储持续时间,它的生命周期将结束并且指针将变得不确定,从而导致未定义的行为。
我知道这是安全的...
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[]
具有自动存储持续时间,它的生命周期将结束并且指针将变得不确定,从而导致未定义的行为。