共用体

共用体(union)は、全メンバの先頭アドレスが同一となって、記憶域を共有します。
同時に使われることのないメンバを共用体とすることで、メモリの使用を制限し、記憶域を節約することが出来ます。
メモリの使用を制限して型の違う変数を使用したい場合に使用されます。

それぞれのメンバの型は違っていても問題ありません。
また、共用体のサイズは最も大きなメンバのサイズとなります。


同一の先頭メンバの並び

共用体を効果的に活用できるように、ある特別な規則が設けられています。
それが「同一の先頭のメンバの並び(common initial sequence)」という考え方です。
すなわち、共用体が同一の先頭のメンバの並びをもついくつかの構造体をもち、共用体オブジェクトが現在 それらの構造体の一つを保持している場合、いずれの構造体の同一の先頭メンバの並びを参照してもよい、 また、先頭から一つ以上のメンバに対して、対応するメンバが適応する型(かつ、ビットフィールドに対しては、 同じ幅)をもつ場合、二つの構造体は、同一の先頭のメンバの並びをもちます。

共用体を使用した記述例

// 共用体 program in C.    
#include <stdio.h>  

// 動物 (犬/猫) 共用体
typedef union 
{
    struct
    {
        int     type;           // 種別
    } code;
    struct
    {
        int     type;           // 1:犬
        char    *name;          // 名前
    } dog;
    struct
    {
        int     type;           // 2:猫
        double  weight;         // 体重
    } cat;
} ANIMAL;

void print_animal(const ANIMAL *animal)
{    
    switch (animal->code.type)
    {
        case 1: printf("犬:%s\n", animal->dog.name);        break;
        case 2: printf("猫:%.1fkg\n", animal->cat.weight);  break;
    }
}
    
int main(int argc, char *args[])
{    
    ANIMAL a, b; 
    a.dog.type = 1; 
    a.dog.name = "taro"; 
    b.cat.type = 2; 
    b.cat.weicht = 3.5; 

    print_animal(&a);
    print_animal(&b);
        
    return 0;
}

実行結果

犬:taro
猫:3.5kg


Last updated:2018/09/09
Author:efn

';