読者です 読者をやめる 読者になる 読者になる

共用体

C言語 Sample

共用体は、構造体に似ているが、要素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]も同様・・・。

Sample/union.c at master · bg1bgst333/Sample · GitHub