无法弄清楚输出的原因?

时间:2018-04-21 17:34:38

标签: c

//Language C
int main()
{
    int a[5]={0};
    for(int i=0 ; i < 4 ; i++ )
        printf("%d",a[i]);
    }
}

以下输出为gcc中的1000。但我认为它应该打印1并休息垃圾值,因为我没有为其他数组位置分配值。

如果不考虑编译器版本,我的想法是对的吗?或者我错过了一些东西。

1 个答案:

答案 0 :(得分:4)

C标准(引用最新的C11草案N1570)很好地解释了这一点。

§6.7.9初始化,第21页

  

如果括号括起的列表中的初始值设定项少于元素或成员   用于初始化已知数组的字符串文字中的聚合或更少字符   大小比数组中的元素大,聚合的其余部分应为   隐式初始化与具有静态存储持续时间的对象相同。

(强调我的)

因此,代码中除a[0]之外的所有元素都是隐式初始化。现在让我们来看看这意味着什么:

§6.7.9初始化,第10页

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。如果未初始化具有静态或线程存储持续时间的对象   明确,然后:
   - 如果它有指针类型,则将其初始化为空指针;
   - 如果它有算术类型,则初始化为(正或无符号)零;
   - 如果是聚合,则根据这些规则初始化(递归)每个成员,   并且任何填充都初始化为零位;
   - 如果它是一个联合,则根据这些第一个初始化(递归)第一个命名成员   规则,任何填充都初始化为零位;

(再次强调我的)

因此,a[1]a[4]被初始化为0 - 类型int算术类型