这不是对您问题的完整答案,但有助于清除其他答案中的错误信息。
在 ANSI C89 中,相关的标准文本是(第 3.5.7 节):
如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。
一个字符类型的数组可以由一个字符串字面量初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的成员。
它只指定了字符串字面量对应的数组元素的初始化。所以尾随数组元素没有显式初始化,因此具有不确定的值。
还有一段:
如果列表中的初始化器数少于聚合的成员数,则聚合的其余部分应被隐式初始化,与具有静态存储持续时间的对象相同。
但这并不适用,因为我们不是从列表中初始化的(“列表”表示用大括号括起来的列表,而不是字符串文字)。
在 C90 中(我不确定是否可以合法链接),这些部分被重新编号,因此包含这些段落的部分变为 6.5.7。后一段的措辞也发生了变化:
如果大括号括起来列表中的初始化器少于聚合的成员,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。 p>
在 C90 TC1(HTML、PDF)中,上述内容保持不变。
然而,Defect Report 60 提出了一个关键问题:
当一个 char(或 wchar_t)数组用包含的字符数少于数组的字符串字面量进行初始化时,该数组的其余元素是否已初始化?
子条款 6.5.7 初始化,第 72 页,只说(强调我的):
如果大括号括起来的列表中的初始化程序少于聚合的成员,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。 p>
更正
在第 72 页的第 6.5.7 小节中,语义的倒数第二段(在示例之前),在逗号之后添加:
字符串字面量或宽字符串字面量中的字符或更少的字符,用于初始化已知大小的数组,以及字符或 wchar_t 类型的元素
看来,建议修复中的零初始化确实是标准编写者的意图,因为在C90 TC2 中,我们看到了同样的关键更改:
第 72 页
在第 72 页的第 6.5.7 小节中,语义的倒数第二段(在示例之前),在逗号之后添加:
字符串文字或宽字符串文字中用于初始化已知大小的数组以及字符或 wchar_t 类型的元素的字符或更少
给我们:
如果大括号括起来的列表中的初始化程序少于聚合的成员,或用于初始化已知大小数组的字符串文字或宽字符串文字中的字符更少,并且字符或元素wchar_t 类型 聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。
请注意,TC1 的日期是 1994 年,尽管它是在 1995 年出版的。TC2 的日期是 1996 年。令人困惑的是,DR60 的日期是 1993 年 7 月 16 日,因此早于 TC1。也许那时 TC1 的工作已经太先进了,无法处理新的缺陷报告并且积压了?在任何情况下,TC2 主要只是针对缺陷报告的一组更正,表明该更改首先出现在 C95 中,而不是在 C95 中,并且空终止符后字符的零初始化是 C89 标准编写者所拥有的有意的。
在 ISO C99(原始版本,没有技术勘误)中,该段落现在重新编号为 6.7.8/21 并再次更改。删除了“宽字符串文字”和“字符或wchar_t类型的元素”的提及:
如果大括号括起来的列表中的初始化程序少于聚合的元素或成员,或用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。
意味着尾随数组元素被初始化为空字节。
(注意:原始 C99 可能是受版权保护的材料,所以我不能在上面发布指向它的链接。不过,这就是它所说的。Here 是最后一个免费提供的链接工作草案。之后还有两个草案,但 WG14 网站已将其删除。不过,该措辞在 N843 工作草案中,并且仍然存在于后来的包含 TC3 的 C99 中。)
我找不到任何 C95 (ISO/IEC 9899:1990/AMD1:1995) 的免费副本。因此,我无法准确回答在 C89 和 C99 之间的哪个点进行了“宽字符串文字”和“wchar_t”更改。此外,C99 基本原理文档中也没有提及该主题。
当然,C99 的行为可能是 C89 作者的意图,而缺失的文本是疏忽,但在没有任何此类文档的情况下,我们无法得出任何结论,并且可能是从那时起不初始化尾随元素的编译器。
希望拥有这些文件(或倾向于从 ISO 商店购买它们!)的其他人可以提供准确的答案。