其中一些可能是重复的,但我对此感到抱歉
假设我有这个struct
:
struct foo
{
int a;
int b;
int c;
};
1.如果struct foo
类型的对象是以具有自动存储持续时间的方式声明的,并且没有初始化程序,是否保证其所有成员都将被强制初始化为零?
{
// other stuff
struct foo bar;
// other stuff
}
2.如果struct foo
类型的对象是以具有自动存储持续时间的方式声明的,并且带有一些初始值设定项,是否保证未显式初始化的成员将被强制初始化为零?
{
// other stuff
struct foo bar = {.a = 1};
// other stuff
}
3.如果以具有自动存储持续时间的方式声明struct foo
类型对象,并使用复合文字表达式,是否保证未显式初始化的成员将被强制初始化为零?
{
// other stuff
func((struct foo){.a = 1});
// other stuff
}
非常感谢任何C标准参考!非常感谢。
摘要,TL;DR:
说明的存储时间:
- 函数内部声明的变量具有自动存储持续时间(包括函数的参数)
- 声明为
static
的变量或在文件范围("全局")的函数外声明的变量具有静态存储持续时间
结构(和阵列)初始化说明:
- 如果没有初始化任何成员,并且结构具有自动存储持续时间,则不会初始化任何内容
- 如果没有初始化任何成员,并且结构具有静态存储持续时间,则所有成员都为零初始化
- 如果初始化任何成员,则未接触的成员将被初始化为零
C标准的相关部分(C17 6.7.9§10):
如果具有自动存储持续时间的对象没有显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象没有明确初始化,则:
- 如果它有指针类型,则初始化为空指针
- 如果它是算术类型,则初始化为(正或无符号)零
- 如果它是一个聚合,则每个成员都会根据这些规则进行初始化(递归),并且填充被初始化为零比特
其中"artihmetic type"是像int
这样的普通变量的标准胡言乱语,而"aggregate"是数组和结构的标准胡言。
在同一章中(C17 6.7.9§19):
。。。所有未显式初始化的子对象都应像具有静态存储持续时间的对象一样隐式初始化。
您的问题解答:
- 如果struct foo类型对象是以具有自动存储持续时间且没有初始化器的方式声明的,是否保证它的所有成员都将被强制初始化为零
不,不保证;正如上面引用的第一句话所说,它们的价值是不确定的。
- 如果struct foo类型对象是以具有自动存储持续时间的方式声明的,并且带有一些初始化器,是否保证未显式初始化的成员将被强制初始化为零
是,根据上述C17 6.7.9§19。
- 如果struct foo类型对象以具有自动存储持续时间的方式声明,并使用复合文字表达式,是否保证未显式初始化的成员将被强制初始化为零
是的,由于复合文字是数组或结构,它们遵循相同的初始化规则。
首先,具有自动存储的未初始化变量永远不会被初始化。来自C11标准(ISO/IEC 9899:2011§6.7.9/10):
如果具有自动存储持续时间的对象没有显式初始化,则其值是不确定的。
然后从此结构初始化引用:
所有未显式初始化的成员都以与具有静态存储持续时间的对象相同的方式隐式初始化。
如果我们遵循"隐式初始化"链接,我们就会得到:
具有静态和线程本地存储持续时间的对象初始化如下
- 整型对象初始化为无符号零
所以要回答您的问题:
- 不,不进行初始化,因为代码中没有显式初始化(请参阅标准中的引用)
- 是的,因为这是一个结构初始化
- 是的,原因和2相同
提供的链接引用了该标准。