C中字符串文字的类型是什么?是char *
还是const char *
还是const char * const
?
C ++怎么样?
答案 0 :(得分:59)
在C中,字符串文字的类型是char[]
- 根据类型它不是const
,但修改内容是未定义的行为。此外,具有相同内容(或足够相同内容)的2个不同的字符串文字可能会也可能不会共享相同的数组元素。
来自C99标准6.4.5 / 5“字符串文字 - 语义”:
在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列。然后使用多字节字符序列初始化静态存储持续时间和长度的数组,该数组足以包含序列。对于字符串文字,数组元素的类型为
char
,并使用多字节字符序列的各个字节进行初始化;对于宽字符串文字,数组元素的类型为wchar_t
,并使用宽字符序列进行初始化...如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。
在C ++中,“一个普通的字符串文字具有类型'数组'n const char
'”(来自2.13.4 / 1“字符串文字”)。但是在C ++标准中有一个特殊情况,它使得指向字符串文字的指针很容易转换为非const限定的指针(4.2 / 2“数组到指针的转换”):
不是宽字符串文字的字符串文字(2.13.4)可以转换为“指向字符的指针”的右值;宽字符串文字可以转换为“指向wchar_t的指针”的右值。
作为旁注 - 因为C / C ++中的数组很容易转换为指针,所以字符串文字通常可以用在指针上下文中,就像C / C ++中的任何数组一样。
额外的编辑:接下来的内容实际上主要是关于C和C ++标准对字符串文字类型的选择的理由。所以请耐心等待(但如果您有更正或其他详细信息,请发表评论):
我认为C标准选择创建字符串文字非常量类型,因为有(并且是)很多代码希望能够使用指向文字的非const限定char
指针。当添加const
限定符时(如果我没有弄错的话是围绕ANSI标准化时间完成的,但是在K& RC已经存在很长时间以积累大量现有代码之后)如果它们仅指向字符串文字能够被分配到char const*
类型而没有演员几乎每个现有的程序都需要改变。不是一个接受标准的好方法......
我认为对字符串文字const
限定的C ++的更改主要是为了支持允许文字字符串更恰当地匹配带有“char const*
”参数的重载。我认为还需要在类型系统中关闭一个感知的洞,但这个洞在很大程度上是由阵列到指针转换中的特殊情况打开的。
该标准的附录D表明“对于字符串文字(4.2)的从const到非const限定的隐式转换已被弃用”,但我认为这么多代码仍然会破坏编译器的编译时间很长实施者或标准委员会愿意实际拔掉插头(除非可以设计出其他一些聪明的技术 - 但是那个洞会回来,不是吗?)。
答案 1 :(得分:10)
C字符串文字的类型为char [n]
,其中n
等于字符数+ 1,以说明字符串末尾的隐含零。
数组将被静态分配;它不是const
,但修改它是未定义的行为。
如果指针类型为char *
或类型不完整char []
,则sizeof
无法按预期工作。
使字符串文字const
是一个C ++习语,而不是任何C标准的一部分。
答案 2 :(得分:1)
由于各种历史原因,字符串文字在C中始终为char[]
类型。
早期(在C90中),声明修改字符串文字会调用未定义的行为。
他们并没有禁止这样的修改,也没有制作更有意义的字符串文字const char[]
。这是出于旧代码的向后兼容性原因。如果你修改了字符串文字,一些旧操作系统(最着名的是DOS)没有抗议,因此有很多这样的代码。
C ++从C继承了同样的缺陷,但在后来的C ++标准中,它们终于创建了字符串文字const
(在C ++ 03中标记为过时,最后在C ++ 11中修复)。
答案 3 :(得分:0)
他们曾经属于char[]
类型。现在它们的类型为const char[]
。