C字符串(与std::string
相对)是否可以保证实现为数组?比如说,我有
char const * str = "abc";
归结为str + 4
是否为合法指针值(没有解除引用)。我问这个是因为我不知道C字符串是否是特殊情况,因为空字符终止它。
答案 0 :(得分:5)
问题的第一部分
C字符串是否可以保证实现为数组?
例如,我有:
char const * str = "abc"
是的,字符串对象是数组类型。字符串是数据格式,(字符)字符串对象的类型为array
char
。
在您的示例str
中指向字符串文字"abc"
。字符串文字的类型为char[N+1]
,其中N
是字符串的长度(即,不包括终止空字符的字符数)。
标准和K& R第二版的一些参考文献:
C将字符串文字定义为:
(C99,6.4.5p2)“字符串文字是用双引号括起来的零个或多个多字节字符的序列,如”xyz“中所示。”
并说(强调我的):
K& R第二版说:C99,6.4.5p5)“对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化;”
“从技术上讲,字符串常量是数组字符”
和
“当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个字节。