C语言数组中未初始化元素的值

我有一个包含3个元素的数组。 但我只想初始化其中的2个。 我让第三个元素空白。

unsigned char array[3] = {1,2,}; int main(){ printf("%d",array[2]); return 0; } 

打印结果是0.我在IAR和一些在线编译器上测试过它。

第三个元素的值是否有任何C规则? 是否有任何编译器通过0xFF填充第三个元素? (特别是交叉编译器)

是的,C标准确实定义了这种情况下发生的情况。 所以不,在这种情况下,应该没有符合C标准的编译器以0xFF初始化。

该标准的第6.7.9节说:

初始化

10 …如果未明确初始化具有静态或线程存储持续时间的对象,则:

  • 如果它有指针类型,则将其初始化为空指针;
  • 如果它有算术类型,则初始化为(正或无符号)零;
  • 如果是聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;
  • 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;

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

从这篇文章中可以看出,该语法会将逗号后的所有元素初始化为零。 此外; 程序数据段中的所有未初始化数据(换句话说,所有未初始化的全局变量)都自动设置为零,因此如果您在此程序中查找未定义的行为,则没有任何行为; 它总是0。

这可以通过gcc扩展来实现,如下面的unsigned char数组[10] = {1,2,[2 … 9] = 0xFF};