[C言語]猿でもわかる構造体と共用体の違い

構造体と共用体の違いは、メンバのアドレス値を見れば一発でわります。
#include <stdio.h>

typedef struct _TAG_STRCT {
  int i1;
  int i2;
  double d1;
  double d2;
} mystruct;

typedef union _TAG_UNION {
  int i1;
  int i2;
  double d1;
  double d2;
} myunion;

int main()
{
  mystruct s;
  myunion  u;

  printf("address s.i1 = %p\n", &(s.i1));
  printf("address s.i2 = %p\n", &(s.i2));
  printf("address s.d1 = %p\n", &(s.d1));
  printf("address s.d2 = %p\n", &(s.d2));

  printf("\n");

  printf("address u.i1 = %p\n", &(u.i1));
  printf("address u.i2 = %p\n", &(u.i2));
  printf("address u.d1 = %p\n", &(u.d1));
  printf("address u.d2 = %p\n", &(u.d2));
}
実行結果
address s.i1 = 0xbfa57184
address s.i2 = 0xbfa57188
address s.d1 = 0xbfa5718c
address s.d2 = 0xbfa57194

address u.i1 = 0xbfa5719c
address u.i2 = 0xbfa5719c
address u.d1 = 0xbfa5719c
address u.d2 = 0xbfa5719c

解説

構造体sの方は、4つのメンバそれぞれのアドレスが異なっています。
それに対して共用体uの方は、4つのメンバがどれも同じアドレスを指しています。

分かりやすく例えると、
ストラクトじいさんは田んぼを4つ持っています。(小さい田んぼが2つ、大きい田んぼが2つ)。
お隣のユニオンじいさんは、田んぼを1つしか持っていないのに、その田んぼに対して4通りの呼び名をつけています。(小1、小2、大1、大2)

いま、ユニオンじいさんが「田んぼ小1」に稲を植えた(データを置いた)とします。
そうすると、「田んぼ小2」にも同じ稲があることになります。
u.i1 = 100;
printf("u.i1 = %d\n", u.i1); // => 100
printf("u.i2 = %d\n", u.i2); // => 100
さてこのとき、ユニオンじいさんの「田んぼ大1」に何が入ってるのかというと・・・
ええと、
ええと、、、、
「それは聞くな」とユニオンじいさんが言ってましたw
カテゴリ: