Martin
Martin

Reputation: 9359

How to zero-initialize an union?

Consider the following code:

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

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

Since an explicit constructor is called, the above code ends-up zero-initializing all the data members in x.

But I would like to have x zero-initialized even if an explicit is not called. To do that one idea would be to initialize the data members in their declaration, which seems to be okay for T::a. But how can I zero-initialize all the memory occupied by the union by using the same criteria?

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
}

Upvotes: 7

Views: 14444

Answers (3)

bitmask
bitmask

Reputation: 34628

I would suggest to implement a constructor for T:

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

In this case, I picked the largest member of your union since it's transparent. Otherwise you could explicitly create the union itself.

Upvotes: 3

Ben Voigt
Ben Voigt

Reputation: 283624

For a union without a user-defined default constructor, value initialization is zero initialization.

However, zero-initialization of a union may not zero all memory, but only the padding and the first member. If the first member isn't the largest, you could be left with non-zero content.

Since you know that s2 is largest, you can make a default constructor that zeros it:

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

And now

T x;

will be zeroed.

Upvotes: 8

MRAB
MRAB

Reputation: 20654

You could zeroize using memset:

memset(&x, 0, sizeof(x));

Upvotes: 11

Related Questions