你能这样做吗?
char* func()
{
char * c = "String";
return c;
}
这里的“字符串”是编译器全局分配的数据吗?
答案 0 :(得分:6)
你可以做到这一点。但是说:更正确的说法是:
const char* func(){
return "String";
}
c ++规范说字符串文字给出了静态存储持续时间。我无法链接到它,因为在线有很少的c ++规范版本。 const correctness上的此页面是我能找到的最佳参考。
ISO / IEC 14882(编程语言 - C ++)第2.13.4节说:
字符串文字是由双引号括起来的字符序列(在2.13.2中定义),可选 以字母L开头,如“......”或L“......”。不以L开头的字符串文字是普通的 字符串文字,也称为窄字符串文字。普通的字符串文字的类型为“n的数组” const char“和静态存储持续时间(3.7),其中n是下面定义的字符串的大小,并且是 用给定的字符初始化。 ...
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。 尝试修改字符串文字的效果未定义。
答案 1 :(得分:1)
你可以这样做目前(虽然没有理由)。但是你不能再用C ++ 0x做到这一点。他们删除了字符串文字(类型为const char[N]
)的已弃用转换为char *
。
请注意,对于字符串文字,此转换仅 。因此,以下两件事是非法的,第一件事指定一个数组,第二件事指定初始化指针
char *x = (0 ? "123" : "345"); // illegal: const char[N] -> char*
char *x = +"123"; // illegal: const char * -> char*
GCC错误接受两者,Clang正确拒绝两者。
答案 2 :(得分:0)
常量未在堆上分配,但它是常量。你不需要销毁它。
答案 3 :(得分:0)
不在现代编译器中。在现代编译器中,"String"
的类型为const char *
,由于char *
不匹配,您无法将其分配给const
。
如果您使c
成为const char *
(并更改了函数的返回类型),则代码将是合法的。通常,字符串文字"String"
将由链接器放置在可执行文件的数据部分中,并且在许多情况下,放在只读数据的特殊部分中。