代码之家  ›  专栏  ›  技术社区  ›  lvella

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

  •  -3
  • lvella  · 技术社区  · 6 年前

    如果我有以下结构:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Swift - Friday Pie    6 年前

    注意,这是C99语法,它不被C++ 11标准支持,而是由GCC支持。GCC文档声明,这样省略的字段成员将隐式初始化为与具有静态存储持续时间的对象相同的对象。

    可选语法为

    MyStruct s{
            a: &some_var
        };
    

    如果同一个字段被多次初始化,则将使用上次初始化时的值进行初始化。如果这样的初始化导致了副作用,那么副作用是否发生是未指明的。海湾合作委员会只丢弃它们 最后的 初始化发生。

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

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

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