C言語 | 構造体宣言 | 共用体 - union

共用体は構造体に似ていますが、すべてのメンバが同じ記憶領域を共有します。サイズは最大のメンバを格納できる大きさです。

異なる型でメモリを共有する

union キーワードで共用体を宣言します。

union タグ名 {
   メンバ名;
  ...
} 変数名;

メンバへのアクセス方法は構造体と同じですが、各メンバのアドレスは同じです。

#include <stdio.h>

union Value {
  unsigned char chValue;
  int iValue;
};

int main() {
  union Value u;
  u.iValue = 0xFFFF;
  printf("chValue = %08X : &chValue = %p\n"
         "iValue = %08X : &iValue = %p\n",
         u.chValue, (void *)&u.chValue, u.iValue, (void *)&u.iValue);
  return 0;
}

結果はバイト順などの表現方法に依存します。共用体には構造体、配列、別の共用体も含められます。行列を名前付きフィールドと添字付き配列の両方で公開することもできます。

共用体の初期化

メンバは記憶領域を共有するため、一度に1つのメンバを初期化します。指示子なしの初期化子は最初のメンバを初期化します。

union Point {
  struct {
    short int x, y;
  } point;
  int location;
};

union Point u = { { 100, 50 } };

このようにパックされた値を解釈するコードは、型のサイズとバイト順に依存します。前提条件を明確にした上で使用してください。