Unions
Eine Union funktioniert ähnlich wie eine Struktur, mit einem gravierenden Unterschied: Alle Felder einer Union haben die gleiche Speicheradresse und liegen damit übereinander. Das bedeutet aber auch, dass immer nur ein Feld der Union sinnvoll genutzt werden kann.
Unions werden vorrangig dort eingesetzt, wo verschiedene Datentypen für unterschiedliche Anwendungsfälle vorgehalten werden müssen. Je nach Anwendungsfall lassen sich so die passenden Datentypen verwenden, ohne neuen Speicher reservieren zu müssen. Alternativ kann man eine Union aber auch verwenden, um große Datentypen in kleine Aufzuspalten.
Ähnlich einer Struktur entspricht das Alignment einer Union dem Alignment des größten Felds der Union. Da alle Felder aber übereinander liegen, ist die Größe einer Union nur so groß wie das größte Feld.
#include <stdalign.h>
#include <stdint.h>
#include <stdio.h>
union myunion {
uint32_t u32;
uint16_t u8[4];
double d;
};
int main()
{
union myunion uni = { .u32 = 0xAABBCCDD };
printf("%02X, %02X, %02X, %02X,\n", uni.u8[0], uni.u8[1], uni.u8[2], uni.u8[3]);
printf("sizeof(union myunion) : %zd\n", sizeof(union myunion));
printf("alignof(union myunion): %zd\n", alignof(union myunion));
return 0;
}