3

考虑以下代码:

// 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 标准中明确定义的。

4

3 回答 3

13

char symbols[3] = "123";

是一个有效的陈述。

根据 1988 年的 ANSI C 规范:

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

因此,您所做的在技术上是可以的。

请注意,字符数组是对初始值设定项的规定约束的一个例外:

初始化器列表中的初始化器不应多于要初始化的对象。

但是,一段代码的技术正确性只是该代码“优点”的一小部分。该行将char symbols[3] = "123";立即让资深程序员感到怀疑,因为从表面上看,它似乎是一个有效的字符串初始化,以后可能会被这样使用,导致意外错误和一定的死亡。

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

(此处提供规范草案。)

为了在本页的其他地方加入 Rudy 的评论,C99 草案规范的第 32 个示例在第 6.7.8 节(第 130 页)中指出

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

等同于

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

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

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

于 2011-08-02T17:20:14.700 回答
4

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

于 2011-08-02T17:06:16.490 回答
0

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

于 2011-08-02T17:09:09.177 回答