Char数组初始化困境

时间:2011-08-02 17:03:15

标签: c arrays initialization initializer

请考虑以下代码:

// hacky, since "123" is 4 chars long (including terminating 0)
char symbols[3] = "123";

// clean, but lot of typing
char symbols[3] = {'1', '2', '3'};

所以, twist 实际上是在代码注释中描述的,有没有办法用字符串文字初始化char[]而不终止零?

更新:看起来IntelliSense确实是错误的,这种行为在C标准中明确定义。

3 个答案:

答案 0 :(得分:13)

char symbols[3] = "123";

是一个有效的陈述。

根据1988年的ANSI C规范:

  

字符类型数组可以由字符串初始化   文字,可选择括在括号中。连续的人物   字符串文字(包括终止空字符if)   有空间或者如果数组的大小未知)初始化   阵列的成员。

因此,你所做的事情在技术上很好。

请注意,字符数组是初始化程序所述约束的例外:

  

初始化列表中不应再有初始值设定项   是要初始化的对象。

然而,一段代码的技术正确性只是该代码“善”的一小部分。第char symbols[3] = "123";行将立即打击这位资深程序员,因为从表面上看,它似乎是一个有效的字符串初始化,后来可能会被这样使用,导致意外错误和某些死亡。

如果你想走这条路,你应该确定这是你真正想要的。保存这个额外的字节是不值得的,这可能会让你陷入困境。 NULL符号(如果有的话)允许您编写更好,更灵活的代码,因为它提供了一种明确的(在大多数情况下)终止数组的方式。

(草案规范here。)

为了在本页的其他地方选择Rudy的评论,C9草案规范在§6.7.8(第130页)中的第32个例子说明了这些行

char s[] = "abc", t[3] = "abc";

相同
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };

您可以从中推断出您正在寻找的答案。

可以找到C99规范草案here

答案 1 :(得分:4)

如果您的数组只有3个字符长,则第一行代码与第二行相同。字符串末尾的'\0'将不会被存储。 IOW,它没有任何“脏”或“错误”。

答案 2 :(得分:0)

1)您提到的问题不是问题。 2)Que:有没有办法用字符串文字初始化char []而不终止零? - 你已经这样做了。