std :: string 相反)是否保证实现为数组?例如,我有
char const * str =“abc”;
归结起来,问题在于 str + 4 在不解引用的情况下是否为合法指针值。我之所以问这个问题,是因为我不知道C字符串是否由于空字符而成为特例。
std :: string 相反)是否保证实现为数组?例如,我有
char const * str =“abc”;
归结起来,问题在于 str + 4 在不解引用的情况下是否为合法指针值。我之所以问这个问题,是因为我不知道C字符串是否由于空字符而成为特例。
问题的第一部分
C字符串是否保证实现为数组?
例如,我有:
char const * str = "abc"
是的,字符串对象是一个数组类型。字符串是一种数据格式,(字符)字符串对象是char
类型的array
。
在您的示例中,str
指向字符串字面量"abc"
。字符字符串字面量的类型为char[N+1]
,其中N
是字符串的长度(即不包括终止的空字符的字符数)。
以下是标准和K&R第二版的一些参考资料:
C将字符串字面量定义为:
(C99, 6.4.5p2) "A character string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in "xyz"."
并且说(重点在于):
C99, 6.4.5p5) "For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence;"
K&R第二版说:
"技术上讲,一个字符串常量是一个字符数组"
和
"当类似于
"hello\n"
的字符串常量出现在C程序中时,它被存储为一个包含字符串中字符并以'\0'
结尾的字符数组."
问题的第二部分
归根结底,问题是str + 4是否是合法的指针值(不涉及解引用)。
是的,这是一个有效的指针。在您的情况下,str + 4
是一个指向数组最后一个元素之后的指针。
有效指针是一个空指针或指向有效对象的指针。对于数组对象的元素,指向该数组对象最后一个元素之后的指针也是有效的指针。
请注意,对于最后一条规则("超过元素的那个"),对于不是数组元素的对象的指针,C将该对象视为具有其元素类型的一个元素长度的数组。
(C99, 6.5.6p7) "对于这些运算符,指向不是数组元素的对象的指针与指向长度为1且类型为该对象类型的数组的第一个元素的指针行为相同。"
&"string"
的类型为 char (*)[7]
(指向字符数组 7 的指针)。很多编译器在过去会犯这个错误。不确定现在是否还有一些编译器会出现这种情况... - torek&
地址运算符的情况下编写字符串文字时所得到的内容的好方法。我只是指出字符串非常“数组式”,因此您可以像这样获取它们的地址,就好像您已经执行了:const char String [7] =“string”
。 (另外,值得注意的是,尽管“string”的结果类型中缺少const
,但该文字本身至少在原则上是只读的。这种在C类型系统中相当糟糕的故障是由于历史原因造成的。) - torek它们保证是一个连续的char
序列。如果这是你对数组的定义,那么是的。
在你的例子中,你将会有4个字符,每个字符都有一个空终止符。 str+4
将超出范围。
char[4]
确实存在(不包括const
)。 - ouahsizeof(char)
保证为1。(字节不一定是8位,但char始终为一个字节)。 - asaelr