2012/06/01

C言語 共用体 union

共用体は構造体に似ているが、メモリ管理方法が違う。構造体がメンバ変数それぞれのメモリ領域を確保するのに対して、共用体では、すべてのメンバ変数が、ひとつのメモリ領域しか使えない。つまり使える変数は1つだけ。メモリ領域はメンバ変数の中で一番大きな型が確保される。共用体のメリットとしては、メモリ節約が行える。

共用体

#include <stdio.h>
union uni{
  unsigned int int1;
  unsigned short short1;
  unsigned char char1;
};
int main(void){
  union uni ouni;

  ouni.int1 = 0xfedcba98;
  printf("int1  = %8x\n",ouni.int1);
  printf("short1= %8x\n",ouni.short1);
  printf("char1 = %8x\n",ouni.char1);

  ouni.char1 = 0xf;
  printf("int1  = %8x\n",ouni.int1);
  printf("short1= %8x\n",ouni.short1);
  printf("char1 = %8x\n",ouni.char1);
  return 0;
}
3つの異なる型のメンバ変数を用意し、まず一番大きなintに16進数で値を入れる。そして、それぞれのメンバ変数を表示してみる。結果的にはそれぞれの型の領域までしかアクセスしていないのが分かる。次に一番小さい型のcharに16進数のfを代入。そして、それぞれのメンバ変数を表示してみる。書き換えられるのはcharの領域までで、それ以上の桁に関しては前回の値がそのまま維持されているのが分かる。
int1  = fedcba98
short1=     ba98
char1 =       98
int1  = fedcba0f
short1=     ba0f
char1 =        f


C言語 ANSI C89 Meadow & MinGW GCC 目次はこちら