C中的字符串字面值的类型是什么?是char *
还是const char *
或者是const char * const
?
C++呢?
char[]
,根据类型它不是const
的,但修改其内容是未定义行为。此外,两个具有相同内容(或足够相同内容)的不同字符串字面值可能共享或可能不共享相同的数组元素。char
,并使用多字节字符序列的单个字节进行初始化。对于宽字符串字面值,数组元素的类型为wchar_t
,并用广泛字符序列进行初始化...”const char
'的数组”(来自2.13.4/1“字符串字面值”)。但在C++标准中有一种特殊情况,即使是指向字符串字面值的指针也可以轻易地转换为非const限定的指针(4.2/2“数组到指针的转换”):C语言中的字符串字面量类型是char [n]
,其中 n
等于字符数+1,以考虑到字符串末尾的隐式零。
该数组将被静态分配;它不是const
的,但修改它是未定义的行为。
如果它具有指针类型char *
或不完整类型char []
,则sizeof
不能按预期工作。
将字符串字面量设置为const
是C++的习惯用法,而不是任何C标准的一部分。
char[]
类型。早期(在C90中),规定修改字符串字面量会引发未定义行为。然而,他们并没有禁止这种修改,也没有将字符串字面量设为const char[]
,尽管这样做更有意义。这是为了向后兼容旧代码。一些旧操作系统(最著名的是DOS)不会对修改字符串字面量提出异议,因此有很多这样的代码存在。const
(在C++03中被标记为过时,在C++11中最终修复)。它们以前是char[]
类型。现在它们是const char[]
类型。
char x[]="abc";
是一种特殊情况,它声明了一个类型为char[4]
的变量,并按指定方式进行初始化。这是char x[4] = {0x61,0x62,0x63,0};
的简写形式,因此该字符串字面值不像其他字符串字面值那样被编译器放置在某个未命名位置。特别地,它不会像大多数字符串字面值那样被放置在某个未命名位置。 - greggo