结构成员指针是否自动初始化为零?

Is struct member pointers automatically initialized to zero?

本文关键字:初始化 成员 指针 是否 结构      更新时间:2023-10-16

如果我有以下结构:

struct MyStruct {
int *a;
int *b;
};

并像这样初始化它:

int some_var;
MyStruct s{
.a = &some_var
};

我可以确定s.b将被初始化为nullptr吗?

编辑:

完整的编译代码,使用 g++ 7.3.0 进行测试:

// test.cpp
struct MyStruct {
int *a;
int *b;
};
int main()
{
int some_var;
MyStruct s{
.a = &some_var
};
}

如果我在此示例中打印变量值,则 b 确实为 0。但我想知道这种行为是否由标准保证。

注意,这是 C99 语法,C++11 标准不支持,但 GCC 支持。GCC 文档声明,以便省略的字段成员与具有静态存储持续时间的对象一样隐式初始化。

替代语法将是

MyStruct s{
a: &some_var
};

如果多次初始化同一字段,则将使用上次初始化的值对其进行初始化。如果这种初始化导致副作用,则未指定副作用是否发生。 GCC 丢弃它们,只进行最后一次初始化。

以下是兼容C++11的初始化:

MyStruct s { &some_var };  // second field would be initialized as one with static duration

在这两种情况下,GCC 都会发出有关缺少初始值设定项的警告。