※本記事は広告を含みます。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。
C言語の union(ユニオン) は、
struct とよく似た構文を持つデータ型です。
しかし、動作はまったく異なります。
struct は「複数の値を同時に持つ」のに対し、
union は「同じメモリを共有する」仕組みです。
この違いを理解すると、
メモリの使い方や組み込み設計の理解が深まります。
この記事では、
- unionとは何か
- structとの違い
- メモリの違い
- 使用例
- 注意点
を順番に解説します。
unionとは?
union は、複数のメンバが 同じメモリ領域を共有する構造体 です。
union Data {
int i;
float f;
};使い方は struct とほぼ同じです。
union Data data;
data.i = 10;または
data.f = 3.14;どちらか一方の値を保持できます。
初心者さんあれ?
両方入るんじゃないの?



入らないんだ。
同じメモリを使ってるから上書きされるよ
structとの違い
まず struct の場合
struct Data {
int i;
float f;
};これはメモリがこうなります
[i][f]つまり
両方の領域を持ちます。
次に union
union Data {
int i;
float f;
};これはこうなります
[i または f]同じ場所を共有します。



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



そう、最後に代入したものだけ有効になるんだ
structの使い方についてはこちらの記事で解説しています。
実際に動きを見る
#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;
}出力例
10
3.140000
1078523331最後の値が変ですね?
これは float のビット列を
int として解釈しているためです。
つまり union は
同じメモリを
別の型として見る仕組み
になります。
メモリサイズの違い
これが一番重要です。
struct Data {
int i;
float f;
};
union Data2 {
int i;
float f;
};サイズを確認します。
printf("%zu\n", sizeof(struct Data));
printf("%zu\n", sizeof(union Data2));結果(例)
8
4struct
→ 合計サイズ
union
→ 最大サイズ
になります。
つまり
struct
すべてのメンバ分必要
union
一番大きいものだけ必要
となります。



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



そう、これがunionの主な目的になるんだ
unionの使用例
よくあるのは「状態によって型が変わる」場合です。
typedef enum {
TYPE_INT,
TYPE_FLOAT
} Type;
typedef struct {
Type type;
union {
int i;
float f;
} data;
} Value;使用例
Value v;
v.type = TYPE_INT;
v.data.i = 10;または
v.type = TYPE_FLOAT;
v.data.f = 3.14;


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



そう、それが安全な使い方になるよ
unionの注意点
union は型安全ではありません。
data.i = 10;
printf("%f", data.f);これはコンパイルは通りますが
意味のある値ではありません
そのため
- enumで型を管理する
- どの値を入れたか覚えておく
必要があります。
structとunionのまとめ
struct
- メンバごとにメモリ確保
- 同時に保持できる
- 一般的に使う
union
- メンバがメモリ共有
- どれか1つのみ保持
- メモリ節約目的
どんなときに使う?
組み込みでは次の用途が多いです
- 通信データの解釈
- レジスタアクセス
- 型変換
- メモリ節約
例(レジスタ)
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つ
メモリ設計を理解する上で
重要な文法です。
この記事が参考になった方へ
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント