C言語共用体:複数データ型の効率的なメモリ管理
共用体とは
共用体は、同じメモリ位置に異なるデータ型を格納できるC言語で利用可能な特殊なデータ型です。共用体には多くのメンバを定義できますが、任意の時点で値を保持できるのは1つのメンバのみです。共用体は同じメモリ位置を複数の目的で効率的に使用する方法を提供します。
共用体の定義
共用体を定義するには、構造体を定義したときと同じようにunion文を使用します。union文は、プログラム用に複数のメンバを持つ新しいデータ型を定義します。union文の形式:
union [union_tag] {
member_definition;
member_definition;
...
member_definition;
} [one_or_more_union_variables];
共用体タグはオプションで、各メンバ定義は通常の変数定義(int i;、float f;、またはその他の有効な変数定義)です。共用体定義の末尾、最後のセミコロンの前に、1つ以上の共用体変数を指定できますが、これはオプションです。i、f、strという3つのメンバを持つDataという共用体型を定義する方法:
union Data {
int i;
float f;
char str[20];
} data;
これで、Data型の変数は整数、浮動小数点数、または文字列を格納できます。つまり、単一の変数、すなわち同じメモリ位置を使って複数のタイプのデータを格納できます。要件に応じて、組み込みまたはユーザー定義のあらゆるデータ型を共用体内で使用できます。
共用体が占有するメモリは、共用体の最大メンバを保持するのに十分な大きさになります。例えば上記例では、Data型は文字列が占有できる最大スペースである20バイトのメモリ空間を占有します。以下の例は上記共用体が占有する総メモリサイズを表示します:
Live Demo#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
printf("Memory size occupied by data : %d\n", sizeof(data));
return 0;
}
実行結果:
Memory size occupied by data : 20
共用体メンバへのアクセス
共用体の任意のメンバにアクセスするには、メンバアクセス演算子 (.)を使用します。メンバアクセス演算子は、共用体変数名とアクセスしたい共用体メンバの間にピリオドを置いて記述します。共用体型の変数を定義するにはunionキーワードを使用します。以下の例はプログラムでの共用体使用方法を示します:
Live Demo#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
data.f = 220.5;
strcpy(data.str, "C Programming");
printf("data.i : %d\n", data.i);
printf("data.f : %f\n", data.f);
printf("data.str : %s\n", data.str);
return 0;
}
実行結果:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
ここでは、共用体のiとfメンバの値が破損していることがわかります。最後に変数に割り当てられた値がメモリ位置を占有したため、strメンバの値が正しく出力されています。
今度は1度に1つの変数のみを使用する同じ例を見てみましょう。これが共用体を持つ主な目的です:
Live Demo#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("data.i : %d\n", data.i);
data.f = 220.5;
printf("data.f : %f\n", data.f);
strcpy(data.str, "C Programming");
printf("data.str : %s\n", data.str);
return 0;
}
実行結果:
data.i : 10 data.f : 220.500000 data.str : C Programming
ここでは、1度に1つのメンバのみを使用しているため、すべてのメンバが正しく出力されています。
C言語
- マイクロプロセッサ:ストアドプログラムコンピューティングの進化
- 包括的なOp-Ampデータ:National SemiconductorおよびCA3130データシート
- C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
- C言語データ型完全解説:int、float、charなど
- C言語 共用体(Union)解説: 定義・使用法・構造体との比較
- C言語のデータ型完全ガイド:整数、浮動小数点、void型
- C++データ構造:配列、構造体、ポインタで効率的なプログラムを構築
- C++データ抽象化完全マスター:インターフェースと実装の分離
- C++データカプセル化:コードを守る仕組みと実装例
- MATLABデータ型完全ガイド:15種類の基本型と変換・判定関数
- Python データ型マスター: 実践ガイド