5

考虑以下代码:

struct T {
    int a;
    union {
        struct {
            int a;
        } s1;
        struct {
            char b[1024];
        } s2;
    };
};

int main() {
    T x = T();
}

由于调用了显式构造函数,因此上述代码最终将 x 中的所有数据成员初始化为零。

但是即使没有调用显式,我也希望将 x 初始化为零。要做到这一点,一个想法是在声明中初始化数据成员,这对 T::a 来说似乎是可以的。但是如何使用相同的标准对联合占用的所有内存进行零初始化呢?

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
}
4

3 回答 3

8

你可以使用归零memset

memset(&x, 0, sizeof(x));
于 2012-08-04T22:56:56.777 回答
7

对于没有用户定义的默认构造函数的联合,值初始化为零初始化

但是,联合的零初始化可能不会将所有内存归零,而只会将填充和第一个成员归零。如果第一个成员不是最大的,则可能会留下非零内容。

由于您知道这s2是最大的,您可以创建一个将其归零的默认构造函数:

struct T
{
    int a;
    union {
        int s1a;
        char s2b[1024];
    };
    T() : a(), s2b() {}
};

现在

T x;

将归零。

于 2012-08-04T22:59:10.267 回答
2

我建议为:实现一个构造函数T

struct T {
    int a;
    union {
        struct {
            int a;
        } s1;
        struct {
            char b[1024];
        } s2;
    };
    T() : a(), s2() {} // <- proper initialisation
};

在这种情况下,我选择了你最大的成员,union因为它是透明的。否则,您可以显式创建union自身。

于 2012-08-04T23:01:27.527 回答