# What is the logic behind this union behavior?

advertisements

I have declared an union with 2 structures and assigned values to each of the elements and then printed them.

``````union data {
struct s1 {
int a;
int b;
}c;
struct s2 {
int d;
int e;
}f;
} x;

/* Assignment */
x.c.a=1;
x.f.e=2;
x.c.b=3;
x.f.d=4;

printf("%d %d %d %d\n", x.c.a, x.f.e, x.c.b, x.f.d);
```
```

It outputs like this -> `4 3 3 4`

But, when I assign the values in the follwing order ->

``````x.c.b=3;
x.f.d=4;
x.c.a=1;
x.f.e=2;
```
```

It outputs like this -> `1 2 2 1`

What is the logic behind this variation ??

A `union` has enough space to store the largest of its members. In your case, both members are of the same size. The memory layout for `x` is such that it can hold two `int`s.

``````x.c.a=1;    // Sets the value of the first int to 1
x.f.e=2;    // Sets the value of the second int to 2
x.c.b=3;    // Sets the value of the second int to 3
x.f.d=4;    // Sets the value of the first int to 4
```
```

At the end of those statements, you have `3` in the first `int` and `4` in the second `int`.

``````printf("%d %d %d %d\n", x.c.a, x.f.e, x.c.b, x.f.d);
```
```

is equivalent to:

``````int i1 = x.c.a;  // i1 is 4
int i2 = x.c.b;  // i2 is 2

printf("%d %d %d %d\n", i1, i2, i2, i1);
```
```

Which produces the output `4 3 3 4`.

When you use:

``````x.c.b=3;    // Sets the value of the second int to 3
x.f.d=4;    // Sets the value of the first int to 4
x.c.a=1;    // Sets the value of the first int to 1
x.f.e=2;    // Sets the value of the second int to 2
```
```

At the end of those statements, you have `1` in the first `int` and `2` in the second `int`.

That explains the second output.