我们在编程考试中遇到过这个问题,我们都在辩论正确的答案,所以你觉得怎么样?
3.1以下哪项是错误的字符串初始化?
(a) char plant[] = "Tree";
(b) char plant[] = {'T','R','E','E'};
(c) char plant[80] = "Tree";
(d) char plant[80] = {'T','R','E','E'};
(e) None of the above
提前感谢:)
答案 0 :(得分:2)
他们在语法上都是有效的,但我假设问题倾向于(b)
只会创建一个char [4]
- 也就是说,它不会为空终止,而其他三个将是。
答案 1 :(得分:1)
C99和草案C11标准明确定义字符串是以空值终止的:7库7.1.1定义“A 字符串是一个连续的字符序列,由并且包括第一个空字符。“术语”字符串“如此定义 - 并且不仅仅是库中的约定 - ”不正确的字符串初始化“(如问题中所提到的)可以是不包含null的字符串字符。
C11标准在6.7.9中规定¶22“如果初始化未知大小的数组,其大小由具有显式初始化器的最大索引元素确定。”C996.7.8¶22表示相同。这是(b)中的情况,因此未终止且不正确:
char plant[] = {'T','R','E','E'};
6.7.9/6.7.8¶21“如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于在数组中的元素,聚合的其余部分应与具有静态存储持续时间的对象隐式初始化“; ¶10说这些物体充满了(各种)零;这意味着(c)和(d)是空终止的:
char plant[80] = "Tree";
char plant[80] = {'T','R','E','E'};
6.7.9 /6.7.8¶14说“字符数组的数组可以用字符串文字初始化,可选择用大括号括起来。字符串文字的连续字符(包括终止空字符如果有空间,或如果数组未知大小)初始化数组的元素。“这意味着这个(a)是空终止的:
char plant[] = "Tree";