[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
カテゴリ:
C