C言語のunionとは?structとの違いと使いどころをわかりやすく解説

目次

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。

C言語の union(ユニオン) は、
struct とよく似た構文を持つデータ型です。

しかし、動作はまったく異なります。

struct は「複数の値を同時に持つ」のに対し、
union は「同じメモリを共有する」仕組みです。

この違いを理解すると、
メモリの使い方や組み込み設計の理解が深まります。

この記事では、

  • unionとは何か
  • structとの違い
  • メモリの違い
  • 使用例
  • 注意点

を順番に解説します。


unionとは?

union は、複数のメンバが 同じメモリ領域を共有する構造体 です。

C
union Data {
    int i;
    float f;
};

使い方は struct とほぼ同じです。

C
union Data data;

data.i = 10;

または

C
data.f = 3.14;

どちらか一方の値を保持できます。

初心者さん

あれ?
両方入るんじゃないの?

エンジニアくん

入らないんだ。
同じメモリを使ってるから上書きされるよ


structとの違い

まず struct の場合

C
struct Data {
    int i;
    float f;
};

これはメモリがこうなります

C
[i][f]

つまり
両方の領域を持ちます。


次に union

C
union Data {
    int i;
    float f;
};

これはこうなります

C
[i または f]

同じ場所を共有します。

初心者さん

なるほど、どちらかしか持てないんだ

エンジニアくん

そう、最後に代入したものだけ有効になるんだ

structの使い方についてはこちらの記事で解説しています。


実際に動きを見る

C
#include <stdio.h>

union Data {
    int i;
    float f;
};

int main(void)
{
    union Data data;    
    data.i = 10;
    printf("%d\n", data.i);    
    
    data.f = 3.14;
    printf("%f\n", data.f);    
    printf("%d\n", data.i);    
    
    return 0;
}

出力例

C
10
3.140000
1078523331

最後の値が変ですね?

これは float のビット列を
int として解釈しているためです。

つまり union は

同じメモリを
別の型として見る仕組み

になります。


メモリサイズの違い

これが一番重要です。

C
struct Data {
    int i;
    float f;
};

union Data2 {
    int i;
    float f;
};

サイズを確認します。

C
printf("%zu\n", sizeof(struct Data));
printf("%zu\n", sizeof(union Data2));

結果(例)

C
8
4

struct
→ 合計サイズ

union
→ 最大サイズ

になります。

つまり

struct
すべてのメンバ分必要

union
一番大きいものだけ必要

となります。

初心者さん

メモリ節約のための仕組みなんだね

エンジニアくん

そう、これがunionの主な目的になるんだ


unionの使用例

よくあるのは「状態によって型が変わる」場合です。

C
typedef enum {
    TYPE_INT,
    TYPE_FLOAT
} Type;

typedef struct {
    Type type;

    union {
        int i;
        float f;
    } data;

} Value;

使用例

C
Value v;
v.type = TYPE_INT;
v.data.i = 10;

または

C
v.type = TYPE_FLOAT;
v.data.f = 3.14;
初心者さん

なるほど、どの型かをenumで管理するのか

エンジニアくん

そう、それが安全な使い方になるよ


unionの注意点

union は型安全ではありません。

C
data.i = 10;
printf("%f", data.f);

これはコンパイルは通りますが
意味のある値ではありません

そのため

  • enumで型を管理する
  • どの値を入れたか覚えておく

必要があります。


structとunionのまとめ

struct

  • メンバごとにメモリ確保
  • 同時に保持できる
  • 一般的に使う

union

  • メンバがメモリ共有
  • どれか1つのみ保持
  • メモリ節約目的

どんなときに使う?

組み込みでは次の用途が多いです

  • 通信データの解釈
  • レジスタアクセス
  • 型変換
  • メモリ節約

例(レジスタ)

C
typedef union {
    uint32_t value;

    struct {
        uint32_t enable : 1;
        uint32_t mode   : 2;
        uint32_t reserved : 29;
    } bit;

} Register;

まとめ

union は

同じメモリを
複数の型で共有する仕組み

struct との最大の違いは

同時に持てるかどうか

です。

  • struct → 同時に持つ
  • union → どれか1つ

メモリ設計を理解する上で
重要な文法です。

この記事が参考になった方へ

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次