unionとは
union(ユニオン)とは、複数の型が同一のメモリ領域を共有する構造のことです。共用体(きょうようたい)ともいいます。うまく使用すると処理系に依存するような情報を入れないで一つのメモリ領域で異なる種類のデータを処理できます。
C言語のunionは全メンバのオフセットが0である構造体です。したがってunionの宣言方法はstructの代わりにunionを使う点を除いて全く同じ構文です。メンバを参照する方法も構造体と同様で.や->で行います。また演算に関しても構造体に対するのと同じ演算が行えます。
union mydata {
int i;
double d;
char *s;
};
union mydata data;
unionで宣言された変数のサイズは、最低でも全メンバの中で最大のものを格納できる大きさとなります。具体的なサイズは処理系に依存します。変数にはメンバの型のいずれかと一致している型のものを代入することができます。参照される型は最後に格納された型でなくてはなりません。したがって、プログラマが今どの型が共用体に入っているかを管理する必要があります。もし、現在入っている型ではない型で参照された場合、結果は処理系に依存します。
unionの注意点
unionの初期化は最初のメンバの型の値でのみ可能です。上記の例ならばdataはint型でのみ初期化可能です。
unionの利用を簡単にする特別な仕様が一つあります。共用体のメンバとして、先頭のメンバの型が同じ構造体を複数持つ場合は、それら構造体の先頭メンバに限り正確に重なり合うことが保証されるという仕様です。つまり、一つの構造体の先頭メンバに値を保持した場合、別の構造体の先頭メンバでもその値を正しく参照できるということです。例を下記に示します。
union mydata {
struct {
int type;
} n;
struct {
int type;
int i;
} ni;
struct {
int type;
double d;
} nd;
} data;
/* 中略 */
data.nd.type = 1;
data.nd.d = 1.1;
/* 中略 */
if (data.n.type == 1) {
data.nd.d *= 2.0;
}