C字符串是否保证是数组?

时间:2012-03-29 19:36:23

标签: c++ c string

C字符串(与std::string相对)是否可以保证实现为数组?比如说,我有

char const * str = "abc";

归结为str + 4是否为合法指针值(没有解除引用)。我问这个是因为我不知道C字符串是否是特殊情况,因为空字符终止它。

4 个答案:

答案 0 :(得分:5)

问题的第一部分

  

C字符串是否可以保证实现为数组?

     

例如,我有: char const * str = "abc"

是的,字符串对象是数组类型。字符串是数据格式,(字符)字符串对象的类型为array char

在您的示例str中指向字符串文字"abc"。字符串文字的类型为char[N+1],其中N是字符串的长度(即,不包括终止空字符的字符数)。

标准和K& R第二版的一些参考文献:

C将字符串文字定义为:

  

(C99,6.4.5p2)“字符串文字是用双引号括起来的零个或多个多字节字符的序列,如”xyz“中所示。”

并说(强调我的):

  

C99,6.4.5p5)“对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化;”

K& R第二版说:

  

“从技术上讲,字符串常量是数组字符”

  

“当C程序中出现类似"hello\n"的字符串常量时,它将存储为包含字符串中字符的数组字符,并以'\0'结尾标志着结束。“

问题的第二部分

  

它归结为str + 4是否为合法指针值(没有解除引用)。

是的,它是一个有效的指针。在你的情况下,str + 4是一个超过数组最后一个元素的指针。

有效指针是指针,它是空指针或指向有效对象的指针。对于数组对象的元素,超过数组对象的最后一个元素的指针也是有效指针。

请注意,出于最后一条规则(“一个过去的元素”)的目的,对于不是数组元素的对象的指针,C将对象视为一个元素的数组。

  

(C99,6.5.6p7)“出于这些运算符的目的,指向不是数组元素的对象的指针与指向长度为1的数组的第一个元素的指针的行为相同对象的元素类型。“

答案 1 :(得分:3)

保证它们是char s的连续序列。如果这是你对数组的定义,那么是。

在你的例子中,你将有4个字符,每个字符一个,空终止符一个。 str+4将超出范围。

答案 2 :(得分:2)

  

C字符串是否可以保证实现为数组?

对于 array 的广泛定义,是的,它们是具有终止空字符的连续字符序列。

  

它归结为str + 4是否为合法指针值

文字("abc")是存储在进程内存中某处的数组。类型是const char[4](在C ++中,我不确定在C中它是char[4])。然后str是指向字符串文字的第一个元素的指针,表达式str+3是正确的,可以取消引用,并且指向的字符将为0.表达式str+4是一个指针超出数组的末尾,无法解除引用。

答案 3 :(得分:0)

简短的回答是:是的,它们是但str + 4不一定是合法的指针,因为1个字符可能不等于1个字节。