将struct初始化为零,除了一个字段

时间:2016-09-05 10:30:52

标签: c struct

考虑以下结构:

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};

承诺是否所有其他字段始终为零?

2 个答案:

答案 0 :(得分:6)

  

是否承诺所有其他字段始终为零?

是。未显式初始化的成员将作为指定初始化程序的一部分进行零初始化。你甚至不需要0那里。这样:

sampleStruct globalStruct = {.b = true};

应该足够了。

答案 1 :(得分:3)

是的,这由C11 6.7.9 / 21保证:

  

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

"骨料"是标准的乱码意思:数组或结构或联合。而不是简单的单值变量("标量")。

在上面,"初始化,好像它有静态存储持续时间"指(6.7.9 / 10):

  

如果未初始化具有静态或线程存储持续时间的对象   明确地,然后:
   - 如果它有指针类型,则初始化为a   空指针;
   - 如果它有算术类型,则将其初始化为   (正数或无符号)零;
   - 如果是聚合,则每个成员都是   根据这些规则初始化(递归),任何填充都是   初始化为零位;
   - 如果是联盟,则是第一个指定的成员   根据这些规则和任何填充初始化(递归)   被初始化为零位;

这适用于初始化列表中的所有形式的初始值设定项。指定的初始化程序也不例外,也不例外。