当我像这样声明一个二维数组时:
char myArray[20][30] = {"ABC", "Is Easy As One Two Three"};
我可以假设这个数组中的所有其他字符现在都设置为\000
吗?
对象永远不会在 C 中部分初始化 - 如果您使用了初始化程序,则保证整个对象都被初始化(在这种情况下,“对象”是 20 个数组的整个数组,每个数组 30 个字符)。任何未显式初始化的成员都递归地初始化为零(对于算术类型)或 NULL(对于指针类型)。
因此,在这种情况下,答案是肯定的——char
初始化器未明确给出值的所有 s 都保证为 0。
这在 C99 标准的第 6.7.8 节“初始化”中进行了描述。相关段落是:
21 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的剩余部分应隐式初始化与具有静态存储持续时间的对象相同。
和
10 如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:
— 如果它具有指针类型,则将其初始化为空指针;
— 如果它具有算术类型,则将其初始化为(正或无符号)零;
— 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
— 如果是联合,则根据这些规则(递归地)初始化第一个命名成员。