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

noa*_*got 3 c struct

考虑以下结构:

typedef struct _sampleStruct{
    bool b;
    int i;
    double d;
    int arr[10];
}sampleStruct;
Run Code Online (Sandbox Code Playgroud)

我想初始化一个全球性的是结构,使得实例b的初始化true和字段的其余部分被初始化为0.另外,我想初始化采取地方,我宣布了,即我并不想这样做那:

sampleStruct globalStruct = {0};

int someFunc()
{
    //...
    globalStruct.b = true;
    //...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?我想做类似的事情:

sampleStruct globalStruct = {.b = true, 0};
Run Code Online (Sandbox Code Playgroud)

它是否承诺所有其他领域始终为零?

Lun*_*din 7

是的,C11 6.7.9/21 保证了这一点:

\n\n
\n

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

\n
\n\n

“聚合”是标准的胡言乱语意思:数组或结构或联合。与普通的单值变量(“标量”)相反。

\n\n

在上面,“初始化就像它具有静态存储持续时间”的意思是(6.7.9/10):

\n\n
\n

如果具有静态或线程存储持续时间的对象未显式初始化,则:
\n \xe2\x80\x94 如果它具有指针类型,则将其初始化为\n 空指针;
\n \xe2\x80\x94 如果是算术类型,则初始化为\n(正或无符号)零;
\n \xe2\x80\x94 如果它是一个聚合,则每个成员都会根据这些规则(递归地)初始化,并且任何填充都会初始化为零位;
\n \xe2\x80\x94 如果是联合,则根据这些规则(递归地)初始化第一个命名成员\n,并且任何填充\n都初始化为零位;

\n
\n\n

这适用于初始值设定项列表中所有形式的初始值设定项。指定的初始值设定项也不例外,也不是特殊情况。

\n


usr*_*usr 6

它是否承诺所有其他领域始终为零?

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

sampleStruct globalStruct = {.b = true};
Run Code Online (Sandbox Code Playgroud)

应该足够了.

  • 你在哪里读那些?我的回答只说*零初始化*. (5认同)