C言語における構造体(struct)と共用体(union)の違いを徹底解説
C言語における構造体(struct)と共用体(union)の違い
C言語には、複数のデータをまとめて扱うための「コンテナ」がいくつか用意されています。同じ型のデータを格納する場合には配列(Array)を使用しますが、intやcharなど異なる型のデータを1つのまとまりとして扱いたい場合には、構造体(struct)と共用体(union)が活躍します。どちらもユーザー定義型の変数を格納することも可能です。
構造体と共用体は「異なる型のデータを保持できる」という点でよく似ていますが、その内部実装には大きな違いがあります。ここでは、両者の重要な相違点を6つの観点から比較して解説します。
構造体と共用体の比較表
| No. | 項目 | 構造体(struct) | 共用体(union) |
|---|---|---|---|
| 1 | 定義 | 異なる型のデータ変数を格納するためにC言語で定義されたコンテナであり、ユーザー定義型の変数の格納にも対応しています。 | 同様に、異なる型の変数やユーザー定義型の変数を保持できるC言語のコンテナです。 |
| 2 | 内部実装 | 各メンバーごとに個別のメモリ領域が割り当てられます。 | すべてのメンバーの中で最大サイズのメンバーに対してのみメモリが割り当てられ、その領域を全メンバーで共有します。 |
| 3 | 宣言の構文 | struct struct_name {
type element1;
type element2;
...
} variable1, variable2, ...; | union u_name {
type element1;
type element2;
...
} variable1, variable2, ...; |
| 4 | サイズ | 各メンバーが独立したメモリを持つため、構造体のサイズは全データメンバーの合計サイズ以上になります。 | メンバーごとの個別領域がないため、共用体のサイズは最大のメンバーのサイズと等しくなります。 |
| 5 | 値の格納 | 各メンバーに専用のメモリ領域があるため、複数のメンバーの値を同時に保持できます。 | 全メンバーで1つのメモリ領域を共有しているため、ある時点で保持できる値は1つだけです。 |
| 6 | 初期化 | 複数のメンバーを同時に初期化できます。 | 一度に初期化できるのは最初のメンバーのみです。 |
使い分けのポイント
構造体は、「氏名・年齢・身長」のように関連する複数の情報を同時に保持したい場合に適しています。一方、共用体は、同じメモリ領域を異なる型で解釈したい場合(ハードウェアレジスタの操作やメモリの節約など)に有効です。
ただし、共用体では最後に代入したメンバーの値しか正しく読み取れないため、使用する際にはこの挙動を十分に理解しておくことが重要です。用途に応じて両者を使い分けることで、より効率的で安全なCプログラムを書くことができます。
-
C#におけるクラスと構造体の違いを徹底解説
C#におけるクラスと構造体の基本的な違い クラス(Class)と構造体(Struct)を正しく使い分けるためには、まず両者が「データの定義と保持」という点において、ほぼ同等の役割を果たすことを理解しておく必要があります。どちらもデータメンバーを定義し、既定値を保持することが可能です。しかしそれ以外の側面、たとえばメモリ管理や継承といった機能面で比較すると、クラスの方が構造体よりも柔軟性が高く、より多くの機能を提供しています。 以下の表に、クラスと構造体の重要な違いを6つの観点からまとめました。 番号項目クラス構造体 1データ型クラスで定義されたデータは、メモリ上に参照として格納され、ア
-
C#のHashtableとDictionaryの違いとは?特徴と使い分けを徹底解説
C#では、データを「キー」と「値」のペア(Key/Value)で格納できるコレクションとして、HashtableとDictionaryの2つがよく使われます。一見似ていますが、型の制約やパフォーマンス、エラー処理などに重要な違いがあります。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。 HashtableとDictionaryの主な違い 項目HashtableDictionary 定義System.Collections名前空間に属する非ジェネリック(non-generic)コレクション。キーと値のペアでデータを格納します。System.Collect