我有以下代码
int t[] = {
[1] = 45,
[2] = 33
};
在这种情况下,t[0]
的价值是多少?它会包含垃圾吗?
答案 0 :(得分:12)
其他值将被初始化;来自C11标准,§6.7.9初始化,¶19和¶21:
初始化应在初始化器列表顺序中进行,每个初始化器为特定子对象提供,覆盖同一子对象的任何先前列出的初始化器; 151)所有未明确初始化的子对象应隐式初始化与具有静态存储持续时间的对象相同。
151)子对象的任何初始化程序都被覆盖,因此不用于初始化该子对象,可能根本不会进行评估。
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则剩余的聚合应隐式初始化,与具有静态存储持续时间的对象相同。
未初始化的int
静态存储持续时间被隐含地初始化为零;同一节,¶10:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果未显式初始化具有静态或线程存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有指针类型,则将其初始化为空指针;
- 如果有算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零位;
- 如果它是一个联合,则根据这些初始化(递归)第一个命名成员 规则,任何填充都初始化为零位;
C89和C99中的行为相同。