【问题标题】:Does "char input[10]={0}" initialize all elements?“char input[10]={0}” 是否初始化所有元素?
【发布时间】:2018-04-23 12:05:15
【问题描述】:

我认为这个 C 语句:

 char input[10]={0}

input 的第一个字符赋值为0,将数组中剩余的字符赋值为NULL。所有 C 编译器都会发生这种情况吗?

【问题讨论】:

标签: c arrays initialization


【解决方案1】:

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

C standard 的第 6.7.9 节详细说明了此行为:

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

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

...

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

第 21 段指出,如果初始化程序没有足够的元素来初始化变量,则其余值将像具有静态存储持续时间的变量一样进行初始化(即文件范围内的变量,或声明为 @987654322 的局部变量@)。

至于如何初始化静态存储,第 10 段指出算术类型(char 是)用值 0 初始化。这与 NULL 不同,后者是一个空指针常量,但是在许多实现中它具有相同的值。

所以是的,任何兼容的 C 编译器都以这种方式初始化。

【讨论】:

    【解决方案2】:

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

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

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

    并且,从第 10 段开始,

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

    ——如果是指针类型,则初始化为空指针;

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • int x[10] = {1} 怎么样;全部归一?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 2018-01-27
      • 2020-09-15
      相关资源
      最近更新 更多