Union in C

Unions are derived data types, the way structures are. Unions and structures look alike, but are engaged in totally different activities

Both structures and unions are used to group a number of different variables together. But while a structure enables us treat a number of different variables stored at different places in memory, a union enables us to treat the same space in memory as a number of different variables. That is, a union offers a way for a section of memory to be treated as a variable of one type on one occasion, and as a different variable of a different type on another occasion

Example of Union In C

# include <stdio.h>
int main( )
{
union a
{
short int i ;
char ch[ 2 ] ;
} ;
union a key ;
key.i = 512 ;
printf ( "key.i = %d\n", key.i ) ;
printf ( "key.ch[ 0 ] = %d\n", key.ch[ 0 ] ) ;
printf ( "key.ch[ 1 ] = %d\n", key.ch[ 1 ] ) ;
return 0 ;
}

Output of this programme

key.i = 512
key.ch[ 0 ] = 0
key.ch[ 1 ] = 2

As you can see, first we declared a data type of the type union a, and then a variable key to be of the type union a. This is similar to the way we first declare the structure type and then the structure variables. Also, the union elements are accessed exactly the same way in which the structure elements are accessed, using a ‘.’ operator. However, the similarity ends here

To illustrate this let us compare the following data types:

struct a
{
short int i ;
char ch[ 2 ] ;
} ;
struct a key

This data type would occupy 4 bytes in memory, 2 for key.i and 1 each for key.ch[ 0 ] and key.ch[ 1 ]

Struct memory allocation
Struct memory allocation

Now we declare a similar data type, but instead of using a structure we use a union

union a
{
short int i ;
char ch[ 2 ] ;
} ;
union a key ;

Union memory allocation
Union memory allocation

the union occupies only 2 bytes in memory. Note that the same memory locations that are used for key.i are also being used by key.ch[ 0 ] and key.ch[ 1 ]. It means that the memory locations used by key.i can also be accessed using key.ch[ 0 ] and key.ch[ 1 ]. What purpose does this serve? Well, now we can access the 2 bytes simultaneously (by using key.i) or the same 2 bytes individually (using key.ch[ 0 ] and key.ch[ 1 ]).

Example of Union in C

# include <stdio.h>
int main( )
{
union a
{
short int i ;
char ch[ 2 ] ;
} ;
union a key ;
key.i = 512 ;
printf ( "key.i = %d\n", key.i ) ;
printf ( "key.ch[ 0 ] = %d\n", key.ch[ 0 ] ) ;
printf ( "key.ch[ 1 ] = %d\n", key.ch[ 1 ] ) ;
key.ch[ 0 ] = 50 ; /* assign a new value to key.ch[ 0 ] */
printf ( "key.i = %d\n", key.i ) ;
printf ( "key.ch[ 0 ] = %d\n", key.ch[ 0 ] ) ;
printf ( "key.ch[ 1 ] = %d\n", key.ch[ 1 ] ) ;
return 0 ;
}

Output of this programme

key.i = 512
key.ch[ 0 ] = 0
key.ch[ 1 ] = 2
key.i= 562
key.ch[ 0 ] = 50
key.ch[ 1 ] = 2

Leave a Comment