将char *返回到字符串文字

时间:2010-08-24 13:33:56

标签: c++

你能这样做吗?

char* func()
{
   char * c = "String";
   return c;
}

这里的“字符串”是编译器全局分配的数据吗?

4 个答案:

答案 0 :(得分:6)

你可以做到这一点。但是说:更正确的说法是:

const char* func(){
  return "String";
}

c ++规范说字符串文字给出了静态存储持续时间。我无法链接到它,因为在线有很少的c ++规范版本。 const correctness上的此页面是我能找到的最佳参考。

ISO / IEC 14882(编程语言 - C ++)第2.13.4节说:

  1. 字符串文字是由双引号括起来的字符序列(在2.13.2中定义),可选 以字母L开头,如“......”或L“......”。不以L开头的字符串文字是普通的 字符串文字,也称为窄字符串文字。普通的字符串文字的类型为“n的数组” const char“和静态存储持续时间(3.7),其中n是下面定义的字符串的大小,并且是 用给定的字符初始化。 ...

  2. 是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。 尝试修改字符串文字的效果未定义。

答案 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"将由链接器放置在可执行文件的数据部分中,并且在许多情况下,放在只读数据的特殊部分中。