コンテンツにスキップ

C言語/共用体

出典: フリー教科書『ウィキブックス(Wikibooks)』

共用体の基本概念

[編集]

共用体(union)は、C言語のデータ構造の一つであり、複数のメンバーが同じメモリ領域を共有することができる構造体の特殊な形式です。共用体は異なる型のデータを同じメモリ領域で保持し、メモリの効率化や柔軟なデータ表現を可能にします。例えば、複数のデータ型のうちどれか一つを表現する場合に有用です。

共用体の宣言と使用

[編集]

共用体は以下のように宣言します:

union Data {
    int i;
    double f;
    char str[20];
};

この例では、Dataという名前の共用体を宣言しています。この共用体は、整数型のi、浮動小数点型のf、20文字の文字列を格納できるstrという3つのメンバーを持っています。共用体のサイズは、メンバーの中で最大のサイズを持つものと同じです。

共用体のメンバーの利用方法

[編集]

共用体のメンバーにアクセスするには、通常の構造体と同様にドット演算子(.)を使用します。ただし、一度に1つのメンバーのみにアクセスできます。

union Data data;
data.i = 10;
printf("data.i = %d\n", data.i);

data.f = 3.14;
printf("data.f = %.2f\n", data.f);

strcpy(data.str, "Hello");
printf("data.str = %s\n", data.str);

この例では、共用体Dataを宣言し、それぞれのメンバーに値を代入しています。共用体の各メンバーは同じメモリ領域を共有しているため、一度に1つのメンバーに値を設定すると、他のメンバーの値は上書きされます。

共用体の初期化

[編集]

共用体の初期化は、特定のメンバーにのみ値を設定する方法と、共用体全体をゼロ初期化する方法があります。

union Data data = { 10 };      // i メンバーにのみ値を設定
union Data data = { .f = 3.14 }; // f メンバーにのみ値を設定

初期化リストを使用して、特定のメンバーにのみ値を設定することができます。残りのメンバーは自動的にゼロ初期化されます。

共用体の応用例

[編集]

共用体の応用例として、異なる型のデータを共有するデータ構造や、ハードウェアのレジスタやネットワークパケットの解析などが挙げられます。これにより、メモリ使用量を最適化しながら柔軟なデータ表現が可能となります。

共用体と列挙型(enum)との組み合わせ

[編集]

共用体と列挙型(enum)を組み合わせて、さらに複雑なデータ構造を定義することができます。例えば、特定の型のデータを表現する共用体と、その型を示す列挙型を組み合わせることができます。

#include <stdio.h>

enum DataType { INT, DOUBLE, STRING };
struct Data {
    enum DataType type;
    union {
        int i;
        double f;
        char str[20];
    };
};

int main() {
    struct Data d = {.type = INT, .i = 42};

    switch (d.type) {
        case INT:
            printf(".i = %d\n", d.i);
            break;
        case DOUBLE:
            printf(".f = %f\n", d.f);
            break;
        case STRING:
            printf(".str = %str\n", d.str);
            break;
    }
}

この例では、Data構造体にtypeメンバーを用意し、それがどの型のデータを表しているかを示す列挙型DataTypeと組み合わせています。

共用体の注意点と使用上の考慮事項

[編集]

共用体を使用する際に注意すべきポイントとして、各メンバーが同じメモリ領域を共有するため、正しいメンバーへのアクセスを保証する必要があります。また、メモリ配置やアライメント、セキュリティ上のリスクも考慮する必要があります。

共用体の実装例と演習問題

[編集]

以下に、共用体を使用した具体的なプログラム例を示します。

#include <stdio.h>

union Data {
    int i;
    double f;
    char str[20];
};

int main() {
    union Data data;

    data.i = 10;
    printf("data.i = %d\n", data.i);

    data.f = 3.14;
    printf("data.f = %.2f\n", data.f);

    strcpy(data.str, "Hello");
    printf("data.str = %s\n", data.str);

    return 0;
}

このプログラムでは、Data共用体を使用して整数、浮動小数点数、文字列を格納し、それぞれのメンバーを表示しています。

まとめ

[編集]

共用体は、異なるデータ型のデータを同じメモリ領域で保持し、必要に応じてアクセスすることができる柔軟な機構です。メモリ効率の向上や、複数のデータ型を扱うシステムでの利用が特に有益です。ただし、使用する際には適切なメンバーのアクセス管理やデータの整合性の確保が重要です。