这
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 规范草案可在此处找到。