第22回

共用体

98/11/06 IE4.xに対応させた

今回は共用体についてです。共用体と構造体の違いは、各メンバに対するメモリ上のアドレスの割り当て方です。
構造体変数のメンバは、メモリ上の連続したアドレスに、それぞれ独立して格納されます。それに対して共用体変数のメンバが格納されるのは、全て同一のアドレスとなります。

それでは実際にそのことを確かめてみることにします。まずは構造体から・・・
#include<stdio.h>
struct{int n1; char n2; }test;
main(){
    printf("test.n1は、アドレス0x%xから%dバイト分\n",&test.n1,sizeof(test.n1));
    printf("test.n2は、アドレス0x%xから%dバイト分\n",&test.n2,sizeof(test.n2));
}
私のマシンでの実行結果は、
test.n1は、アドレス0x454から2バイト分
test.n2は、アドレス0x456から1バイト分
あ、そういえば、sizeof演算子は今回初登場ですね。sizeof演算子は、オペランドのサイズをバイト数で返します。つまり私のマシンは、int型変数(test.n1)は2バイト、char型変数(test.n2)は1バイトという訳です。
これで、構造体変数testのメンバn1とn2は、連続したアドレスにそれぞれ独立して格納されていることが確認できました。

続いて、共用体の場合はどうなるか確認してみましょう。さっきのプログラムの2行目

struct{int n1; char n2; }test;
の、structの部分をunionに変更して下さい。以下のようになります。
#include<stdio.h>
union{int n1; char n2; }test;
main(){
    printf("test.n1は、アドレス0x%xから%dバイト分\n",&test.n1,sizeof(test.n1));
    printf("test.n2は、アドレス0x%xから%dバイト分\n",&test.n2,sizeof(test.n2));
}
私のマシンでの実行結果は、
test.n1は、アドレス0x454から2バイト分
test.n2は、アドレス0x454から1バイト分
共用体変数testのメンバn1とn2の先頭アドレスが、どちらも0x454になっていることを確認して下さい。

共用体は、そのメンバに割り当てられるアドレスが同一である為に、どれか1つのメンバの値が変わると、他のメンバの値も変わってしまいます。つまり共用体は、いろんな型の変数を同一の記憶領域で取り扱う為のものなのです。

つづく。


[メニュー][第21回][第23回]

いーざ
email:CQP00202@nifty.ne.jp