这很正常:
[const] char *str = "some text";
但初始化与重新分配不同,字符串文字有点特殊。如果你试图这样做有什么规则:
[const] char *str = "some text";
str = "some other text";
注意在有人说"尝试之前"我问的是语言规范说的是什么,而不是我特定的编译器所做的。
答案 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* const
和char 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";