其中一些可能是重复的,但对此感到抱歉。
假设我有这个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标准参考都非常感谢!谢谢!
答案 0 :(得分:5)
摘要,TL; DR :
存储期限说明:
static
的变量或在文件范围(“全局”)的函数外部声明的变量具有静态存储持续时间。 结构(和数组)初始化说明:
C标准的相关部分(C17 6.7.9§10):
如果未自动初始化具有自动存储期限的对象,则其值不确定。如果未明确初始化具有静态或线程存储持续时间的对象,则:
- 如果具有指针类型,则将其初始化为空指针;
- 如果具有算术类型,则将其初始化为(正数或无符号)零;
- 如果是集合,则根据这些规则(递归地)初始化每个成员, 填充被初始化为零位;
对于诸如int
之类的普通变量,“人工类型”是标准乱码,而对于数组和结构,“聚合”是标准乱码。
在同一章中进一步(C17 6.7.9§19):
...所有未明确初始化的子对象应与具有静态存储期限的对象隐式初始化。
回答您的问题:
- 如果以具有自动存储持续时间且没有初始化程序的方式声明struct foo类型对象,是否可以保证将其所有成员强制初始化为零?
不,不保证;如上面引用的第一句话所述,它们的值是不确定的。
- 如果以具有自动存储持续时间的方式声明struct foo类型对象并使用某些初始化程序,是否可以确保未明确初始化的成员将被强制初始化为零?
是的,根据上面引用的C17 6.7.9§19。
- 如果以具有自动存储持续时间的方式声明struct foo类型对象并使用复合文字表达式来声明,是否保证未明确初始化的成员将被强制初始化为零?
是的,因为复合文字是数组或结构,所以它们遵循相同的初始化规则。
答案 1 :(得分:2)
首先,具有自动存储功能的未初始化变量将永远不会被初始化。根据C11标准(ISO / IEC 9899:2011§6.7.9/ 10):
如果未自动初始化具有自动存储期限的对象,则其值不确定。
然后从this structure initialization reference:
所有未明确初始化的成员initialized implicitly与具有静态存储持续时间的对象相同。
如果我们遵循“隐式初始化”链接,我们将获得:
具有静态和线程本地存储持续时间的对象按以下方式初始化
- ...
- 整数类型的对象初始化为无符号零
- ...
所以回答您的问题:
提供的链接引用了该标准。