Char数组初始化困境

考虑以下代码:

// 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'}; 

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

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

这个

 char symbols[3] = "123"; 

是一个有效的声明。

根据1988年的ANSI C规范:

字符类型数组可以由字符串文字初始化,可选地用大括号括起来。 字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的成员。

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

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

初始化列表中不应有初始化器,而不是要初始化的对象。

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

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

( 此处提供的草案规范。)

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

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

是完全相同的

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

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

可以在此处找到C99规范草案。

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

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