请考虑以下代码:
struct T {
int a;
union {
struct {
int a;
} s1;
struct {
char b[1024];
} s2;
};
};
int main() {
T x = T();
}
由于调用了显式构造函数,上面的代码最终将零初始化为x中的所有数据成员。
但即使没有调用explicit,我也希望x初始化为零。要做到这一点,一个想法是在他们的声明中初始化数据成员,这对于T :: a来说似乎没问题。但是如何通过使用来初始化union所占用的所有内存 同样的标准?
struct T {
int a = 0;
union {
struct {
int a;
} s1;
struct {
char b[1024];
} s2;
};
};
int main() {
T x; // I want x to be zero-initialized
}
答案 0 :(得分:6)
您可以使用memset
:
memset(&x, 0, sizeof(x));
答案 1 :(得分:6)
对于没有用户定义的默认构造函数的联合,值初始化是零初始化。
但是,并集的零初始化可能不会将所有内存归零,而只会覆盖填充和第一个成员。如果第一个成员不是最大成员,则可能会留下非零内容。
由于您知道s2
是最大的,因此您可以创建一个默认构造函数来将其归零:
struct T
{
int a;
union {
int s1a;
char s2b[1024];
};
T() : a(), s2b() {}
};
现在
T x;
将归零。
答案 2 :(得分:2)
我建议为T
实现构造函数:
struct T {
int a;
union {
struct {
int a;
} s1;
struct {
char b[1024];
} s2;
};
T() : a(), s2() {} // <- proper initialisation
};
在这种情况下,我选择了union
中最大的成员,因为它是透明的。否则,您可以明确地创建union
本身。