你是否允许将char *重新分配给字符串文字?

时间:2015-08-07 11:13:40

标签: c++

这很正常:

[const] char *str = "some text";

但初始化与重新分配不同,字符串文字有点特殊。如果你试图这样做有什么规则:

[const] char *str = "some text";
str = "some other text";

注意在有人说"尝试之前"我问的是语言规范说的是什么,而不是我特定的编译器所做的。

3 个答案:

答案 0 :(得分:2)

关于char*

从C ++ 11开始,所有代码都是非法的。字符串文字只能绑定到char const*或一般[char] const数组。

请注意,根据§8.5.2/ 1,可以使用字符串文字初始化char[]

  

窄字符类型(3.9.1),char16_t数组,char32_t数组或wchar_t数组的数组可以通过窄字符串文字char16_t初始化字符串文字,char32_t字符串文字或宽字符串文字,或者用括号中的适当类型的字符串文字(2.13.5)。字符串文字值的连续字符初始化数组的元素。

     

[实施例:

char msg[] = "Syntax error on line %s\n";
     

显示一个字符数组,其成员使用字符串文字初始化。 [...]

以前char*受到支持但被视为已弃用。无论如何,通过char*对字符串的修改被认为是未定义的行为。

根据§4.2/ 2(前C ++ 11):

  

不是宽字符串文字的字符串文字(2.13.4)可以转换为“指向char的指针”的右值;宽字符串文字可以转换为“指向wchar_t的指针”的右值。在任何一种情况下,结果都是指向数组第一个元素的指针。仅当存在明确的适当指针目标类型时才考虑此转换,而不是在通常需要从左值转换为右值时。 [注意:此转换已弃用。见附录D.]为了在重载决策(13.3.3.1.1)中进行排序,这种转换被认为是一个数组到指针的转换,然后是一个限定转换(4.4)。 [示例:"abc"转换为“指向const char的指针”作为数组到指针的转换,然后转换为“指向char”作为限定转换。 ]

关于重新分配指针

重新定位char*char const*完全没问题。 const指的是字符,而不是指针。为避免重新分配,您需要分别char* constchar const* const

答案 1 :(得分:2)

让我们将您的问题安排为const char*的分配和重新分配。这是因为字符串文字是一个只读的字符数组,将被终止\0,并且编译器在允许将字符串文字赋值给char*时失效。 C ++ 11明确禁止这样做。

允许将const char*重新分配给不同的文字:此处不存在内存泄漏的危险,因为字符串将存储在已编译二进制文件的只读部分中。

答案 2 :(得分:1)

首先,正确编写

const char *str = "some text";
^^^^^

因为C ++中的字符串文字具有常量字符数组的类型。例如,字符串文字“some text”的类型为const char [10]

表达式中使用的数组名称被隐式转换为指向其第一个元素的指针。

例如在此声明中

const char *str = "some text";

字符串文字隐式转换为类型为const char *的对象,并且具有字符串文字的第一个字符的地址值。

指针可能会被重新分配。赋值运算符可以与指针一起使用。

所以你可以写

const char *str = "some text";
str = "some other text";

现在指针str被重新分配并指向字符串文字“some some text”的第一个字符。

但是,如果将指针本身声明为常量对象,例如

const char * const str = "some text";
             ^^^^^

然后在这种情况下你可能不会重新分配它。编译器将为语句

发出错误
str = "some other text";