自动存储持续时间struct初始化

Kar*_*ška 4 c struct initialization language-lawyer automatic-storage

其中一些可能是重复的,但我很抱歉.
假设我有这个struct:

struct foo
{
    int a; 
    int b; 
    int c;
};
Run Code Online (Sandbox Code Playgroud)

1.如果struct foo类型对象以具有自动存储持续时间且没有初始化程序的方式声明,是否可以保证将其所有成员强制初始化为零?

{
    // other stuff
    struct foo bar;
    // other stuff
}
Run Code Online (Sandbox Code Playgroud)

2.如果struct foo类型对象以具有自动存储持续时间的方式声明并且具有一些初始值设定项,是否可以保证未明确初始化的成员将被强制初始化为零?

{
    // other stuff
    struct foo bar = {.a = 1}; 
    // other stuff
}
Run Code Online (Sandbox Code Playgroud)

3.如果struct foo以具有自动存储持续时间的方式声明类型对象并使用复合文字表达式,是否可以保证未明确初始化的成员将被强制初始化为零?

{
    // other stuff
    func((struct foo){.a = 1});
    // other stuff
}
Run Code Online (Sandbox Code Playgroud)

任何C标准参考都非常感谢!谢谢!

Lun*_*din 5

总结,TL; DR:

存储时间说明:

  • 在函数内声明的变量具有自动存储持续时间(包括函数的参数).
  • 声明为static的变量或在文件范围("global")的函数外部声明的变量具有静态存储持续时间.

结构(和数组)初始化解释:

  • 如果初始化没有成员且结构具有自动存储持续时间,则不会初始化任何内容.
  • 如果初始化没有成员且结构具有静态存储持续时间,则所有成员都是零初始化的.
  • 如果您初始化任何成员,那么您未触摸的成员将初始化为零.

C标准的相关部分(C176.7.9§10):

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

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

"artihmetic类型"是普通变量的标准乱码int,而"aggregate"是阵列和结构的标准乱码.

在同一章中进一步说明(C176.7.9§19):

...所有未明确初始化的子对象应与具有静态存储持续时间的对象隐式初始化.


您的问题的答案:

  1. 如果struct foo类型对象以具有自动存储持续时间且没有初始值设定项的方式声明,是否可以保证将其所有成员强制初始化为零?

不,不保证; 它们的价值是不确定的,如上面引用的第一句所述.

  1. 如果struct foo类型对象以具有自动存储持续时间和一些初始值设定项的方式声明,是否可以保证未显式初始化的成员将被强制初始化为零?

是的,按照上面引用的C176.7.9§19.

  1. 如果以具有自动存储持续时间的方式声明struct foo类型对象并使用复合文字表达式,是否可以保证未显式初始化的成员将强制初始化为零?

是的,因为复合文字是数组或结构,所以它们遵循相同的初始化规则.