我认为这个C语句:
char input[10]={0}
将input
的第一个字符分配给0,并将数组中的其余字符分配给NULL。所有C编译器都会发生这种情况吗?
答案 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值。