#include <stdio.h>
int main()
{
int a[5]={1} ;
int b[5];
b[0]=1 ;
printf("\na[0]=%d, a[1]=%d, a[2]=%d, a[3]=%d, a[4]=%d",a[0],a[1],a[2],a[3],a[4]);
printf("\nb[0]=%d, b[1]=%d, b[2]=%d, b[3]=%d, b[4]=%d",b[0],b[1],b[2],b[3],b[4]);
return 0 ;
}
查看代码。我在两个过程中部分分配了两个整数数组(1个元素分配了5个)。
第一个用括号分配。
通过访问一个数组索引来分配第二个。
然后我打印整个阵列。
在第一个数组中,我在未分配的索引中得到0(零)。在第二个数组中,我在未分配的索引中获得了垃圾值。
请你解释一下。
请不要解释这里发生的事情。但请好好解释一下为什么会这样?原因。
答案 0 :(得分:1)
使用
int a[5]={1} ;
您将第一个元素初始化为1
,其余元素将自动初始化为0
。
使用
int b[5];
b[0]=1 ;
您没有初始化任何元素,数组的内容(定义后)将不确定。然后,将值1
指定给b[0]
,使数组的其余部分保持未初始化状态。
答案 1 :(得分:1)
这是正确的行为。
int a[5]={1} ; // 1,0,0,0,0
使用这些值初始化数组。
对于第二种情况,仅初始化b[0]
。其余元素包含不确定的值。
标准本身的一个例子 6.7.9.27 [N1570]
示例4声明
int z[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
按指定初始化z的第一列,并用零初始化其余部分。
在标准的同一段中,它说 6.7.9.21
如果大括号括号列表中的更少初始值设定项比 是聚合的元素或成员,或者是一个或多个字符 string literal用于初始化已知大小的数组 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间强>
该标准的规则提到: - 6.7.9.10
如果未初始化具有自动存储持续时间的对象 显然,它的价值是不确定的。如果一个对象有静态 或线程存储持续时间未明确初始化,然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果有的话 算术类型,它被初始化为(正或无符号)零;
- 如果 它是一个聚合,每个成员都被初始化(递归) 根据这些规则,任何填充都被初始化为零位;
- 如果是联合,则初始化第一个命名成员(递归) 根据这些规则,任何填充都被初始化为零位;