结构成员指针会自动初始化为零吗?

时间:2018-07-08 20:01:07

标签: c++ struct initialization gcc-warning

如果我具有以下结构:

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。但是我想知道标准是否可以保证这种行为。

1 个答案:

答案 0 :(得分:1)

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

其他语法为

MyStruct s{
        a: &some_var
    };

如果多次初始化同一字段,则将使用上一次初始化的值对其进行初始化。如果这种初始化引起副作用,则不确定是否发生副作用。 GCC会丢弃它们,只有 last 初始化发生。

这是C ++ 11兼容的初始化:

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

在两种情况下,GCC都会发出有关缺少初始化器的警告。