结构成员指针是否自动初始化为零?
Is struct member pointers automatically initialized to zero?
如果我有以下结构:
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 丢弃它们,只发生 last 初始化。
这里是 C++11 兼容的初始化:
MyStruct s { &some_var }; // second field would be initialized as one with static duration
在这两种情况下,GCC 都会发出有关缺少初始化程序的警告。
如果我有以下结构:
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 丢弃它们,只发生 last 初始化。
这里是 C++11 兼容的初始化:
MyStruct s { &some_var }; // second field would be initialized as one with static duration
在这两种情况下,GCC 都会发出有关缺少初始化程序的警告。