共用体は、構造体に似ているが、要素1つ1つにメモリ領域が割り当てられているのではなく、複数の要素が1つのメモリ領域を共有している・・・。
今回は、union_userという共用体を定義・・・。
構造体struct_user_nは、nameだけ・・・。
構造体struct_user_naは、nameとage・・・。
構造体struct_user_nanは、nameとageとnoをもつ・・・。
これらの構造体はunion_userのメンバであり、メモリを共有している・・・。
union_userの配列u(要素数3)を0で初期化しておく・・・。
まず、union_userのサイズを確認する・・・。
u[0]は、nameだけ・・・。
u[1]は、nameとage・・・。
u[2]は、nameとageとnoのすべてをセットする・・・。
u[0]のメンバuser_n, user_na, user_nanのすべてのメンバを出力する・・・。
u[1], u[2]も同様に・・・。
(あれ?for文にするの忘れた・・・。まあ、いいや・・・。)
さて、これで実行すると、
$ vi union.c $ gcc union.c -o union $ ./union sizeof(union union_user) = 16 u[0].user_n.name = Taro u[0].user_na.name = Taro u[0].user_na.age = 0 u[0].user_nan.name = Taro u[0].user_nan.age = 0 u[0].user_nan.no = 0 u[1].user_n.name = Jiro u[1].user_na.name = Jiro u[1].user_na.age = 18 u[1].user_nan.name = Jiro u[1].user_nan.age = 18 u[1].user_nan.no = 0 u[2].user_n.name = Saburo u[2].user_na.name = Saburo u[2].user_na.age = 16 u[2].user_nan.name = Saburo u[2].user_nan.age = 16 u[2].user_nan.no = 3 $
全部構造体なら、サイズが8 + 12 + 16で36ぐらいになりそうだが、メモリを共有してるので一番大きい16しかとっていない・・・。
u[0]のnameはuser_nでもuser_naでもuser_nanでも"Taro", ageもuser_naとuser_nanが同じ0・・・。
これはuser_n, user_na, user_nanでメモリを共有している証拠・・・。
u[1]もu[2]も同様・・・。