2010-08-24 102 views
0

你能做到这一点吗?返回字符*到字符串

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

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

回答

6

你可以这样做。但它会更加正确地说:

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

C++规范说,字符串文字被赋予静态存储持续时间。我无法链接到它,因为有几个版本的C++规范在线。 const correctness上的这个页面是我能找到的最佳参考。

科的ISO/IEC 14882 2.13.4(编程语言 - C++)表示:

  1. 字符串文字是由双引号所包围,任选的字符序列(如在2.13.2中定义的) 以字母“L”开头,如“...”或L“...”。不以L开头的字符串文字是普通的 字符串文字,也被称为窄字符串文字。一个普通的字符串文字的类型为“数组n”,其中n是下面定义的字符串的大小,并且是用给定字符初始化的 。 ...

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

+0

你的意思是2.13.4/1。虽然我不能编辑它! – Chubsdad 2010-08-24 13:57:25

0

常量不是分配在堆上,而是常量。你不需要销毁它。

0

不在现代编译器中。在现代编译器中,"String"的类型为const char *,由于const不匹配,您无法将其分配给char *

如果您制作c a const char *(并更改函数的返回类型),则代码将是合法的。通常,字符串文字"String"将被链接器放置在可执行文件的数据部分中,并且在很多情况下,将放在只读数据的特殊部分。

+1

除C++中有一个特定的规则允许这种隐式转换以便与C代码向后兼容。虽然我不能说C++ 0x。 – 2010-08-24 13:36:58

+0

而且没有理由为什么编译器不能在.text段中放置“String”。 – doron 2010-08-24 13:45:43

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不正确,可同时接收,锵正确地拒绝两者。