考虑以下结构:
typedef struct _sampleStruct{
bool b;
int i;
double d;
int arr[10];
}sampleStruct;
我想初始化该结构的全局实例,以便b
初始化为true
,其余字段初始化为0。
另外,我希望在我声明它的地方进行初始化,即我不想做类似的事情:
sampleStruct globalStruct = {0};
int someFunc()
{
//...
globalStruct.b = true;
//...
}
有办法吗? 我想过做那样的事情:
sampleStruct globalStruct = {.b = true, 0};
承诺是否所有其他字段始终为零?
答案 0 :(得分:6)
是否承诺所有其他字段始终为零?
是。未显式初始化的成员将作为指定初始化程序的一部分进行零初始化。你甚至不需要0
那里。这样:
sampleStruct globalStruct = {.b = true};
应该足够了。
答案 1 :(得分:3)
是的,这由C11 6.7.9 / 21保证:
如果括号括起的列表中的初始值设定项少于此值 是聚合的元素或成员,或者是一个或多个字符 string literal用于初始化已知大小的数组 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。
"骨料"是标准的乱码意思:数组或结构或联合。而不是简单的单值变量("标量")。
在上面,"初始化,好像它有静态存储持续时间"指(6.7.9 / 10):
如果未初始化具有静态或线程存储持续时间的对象 明确地,然后:
- 如果它有指针类型,则初始化为a 空指针;
- 如果它有算术类型,则将其初始化为 (正数或无符号)零;
- 如果是聚合,则每个成员都是 根据这些规则初始化(递归),任何填充都是 初始化为零位;
- 如果是联盟,则是第一个指定的成员 根据这些规则和任何填充初始化(递归) 被初始化为零位;
这适用于初始化列表中的所有形式的初始值设定项。指定的初始化程序也不例外,也不例外。