结构成员指针是否自动初始化为零?
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 丢弃它们,只进行最后一次初始化。
以下是兼容C++11的初始化:
MyStruct s { &some_var }; // second field would be initialized as one with static duration
在这两种情况下,GCC 都会发出有关缺少初始值设定项的警告。
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员