" char输入[10] = {0}"初始化所有元素?

时间:2018-04-23 12:05:15

标签: c arrays initialization

我认为这个C语句:

 char input[10]={0}

input的第一个字符分配给0,并将数组中的其余字符分配给NULL。所有C编译器都会发生这种情况吗?

3 个答案:

答案 0 :(得分:7)

给出的语句显式地将第一个元素初始化为0,并将其余元素隐式设置为0。

C standard的第6.7.9节详述了此行为:

  

10 如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果一个对象那个   静态或线程存储持续时间未明确初始化,   然后:

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

...

     

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

第21段指出,如果初始化程序没有足够的元素来初始化变量,那么剩余的值就像具有静态存储持续时间的变量(即文件范围的变量或声明为{{的局部变量)一样初始化。 1}})。

就初始化静态存储的方式而言,第10段规定算术类型(static是)用值0初始化。这与char不同。空指针常量,但在许多实现中它具有相同的值。

所以是的,任何符合C编译器的编译器都以这种方式进行初始化。

答案 1 :(得分:3)

是的,如果您正在为数组类型使用部分初始化列表,则会初始化其余元素,就像它们具有静态存储一样。

引用C11,章节§6.7.9,初始化,第21段

  

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

,并且,从第10段开始,

  

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

     

- 如果它有指针类型,则将其初始化为空指针;

     

- 如果它有算术类型,则初始化为(正或无符号)零;

     

- 如果是聚合,则根据这些规则初始化(递归)每个成员,   并且任何填充都被初始化为零位;

     

- 如果是联合,则根据这些初始化(递归)第一个命名成员   规则,任何填充都初始化为零位;

在这种情况下,这是算术类型,因此元素的值为0

答案 2 :(得分:-3)

它在数组的所有位置存储NULL值。