你好我是 C编程语言的初学者,最近我开始学习数组,我研究过默认情况下int数组中的所有值都是垃圾即可。
那么为什么我在这两种情况下得到不同的值。
案例-1
int arr[5];
在这种情况下从arr [0]到arr [4]我们将有垃圾值,但在下一种情况下。
案例-2
int arr[5] = {1};
在这种情况下,arr [0]的值为1,从arr [1]到arr [4]的值将为0。
我的问题是,在case-1中,每个未初始化的阵列位置都有垃圾valeus,那么为什么在-2的情况下,剩余的未启动阵列位置的默认值为0。
答案 0 :(得分:11)
C11 6.7.9初始化p19 涵盖了这一点(我的重点)
初始化应在初始化程序列表顺序中进行,每个初始化程序都为覆盖任何子对象的特定子对象提供 以前列出的同一子对象的初始值设定项; 151)全部 未初始化的子对象应初始化 隐含地与具有静态存储持续时间的对象相同。
部分 6.7.9 p10 表明
如果具有静态或线程存储持续时间的对象不是 显式初始化,然后...如果它有算术类型,它是 初始化为(正数或无符号)零;
答案 1 :(得分:9)
C99草案说:
如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
静态对象初始化为零。
因此,没有任何初始化程序之间存在很大差异,它会为您提供未初始化的内存内容(您称之为“垃圾”),并且具有初始化程序。如果初始化程序存在但缺少数据,则默认情况下为0。
这非常方便,因为它可以像你一样对初始化大型数组进行初始化。
答案 2 :(得分:4)
您缺少的是,如果只初始化数组的一个元素,其余元素将自动初始化为0.语言以这种方式定义。
答案 3 :(得分:1)
引用here(点击链接,你可以在那里找到更多有用的信息)
如果括号括起的列表中的初始值设定项少于此值 是聚合的元素或成员,或者是一个或多个字符 string literal用于初始化已知大小的数组 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。