C言語における構造体(struct)と共用体(union)の違いとは?
C言語には、複数のデータをひとまとめに扱うためのユーザー定義型として「構造体(structure)」と「共用体(union)」があります。どちらも異なる型のデータを組み合わせられる点で似ていますが、メモリの扱い方に大きな違いがあります。本記事では、それぞれの特徴と使い方、そして両者の違いについて詳しく解説します。
構造体(Structure)とは
構造体は、異なるデータ型を1つの型にまとめるためのユーザー定義データ型です。int型やfloat型、char型など、さまざまな型のメンバー変数を複数持つことができます。C言語では「struct」というキーワードを使って構造体を定義し、各メンバーにはドット演算子(.)を使ってアクセスします。
構造体では、すべてのメンバーが個別のメモリ領域を持つため、全体のサイズは各メンバーのサイズの合計(アライメント調整を含む)になります。
構造体の基本構文
struct structure_name {
member definition;
} structure_variables;
- structure_name:構造体につける任意の名前
- member definition:メンバー変数の定義群
- structure_variable:構造体型のオブジェクト(変数)
構造体の使用例
#include <stdio.h>
#include <string.h>
struct Data {
int i;
long int f;
} data, data1;
int main( ) {
data.i = 28;
printf("i の値 : %d\n", (data.i));
printf("data が占有するメモリサイズ : %d\t%d", sizeof(data), sizeof(data1));
return 0;
}
実行結果
i の値 : 28 data が占有するメモリサイズ : 16 16
この例では、int型とlong int型の2つのメンバーを持つ構造体を定義しています。実行結果からわかるように、各メンバーが独立したメモリ領域を持つため、合計16バイトのメモリが割り当てられています。
共用体(Union)とは
共用体も構造体と同様にユーザー定義データ型ですが、最大の特徴はすべてのメンバーが同じメモリ位置を共有するという点です。そのため、共用体のサイズは最も大きいメンバーのサイズによって決まります。同じメモリ領域を複数のメンバーで使い回したい場合に、共用体が適しています。
共用体は構造体とよく似ており、変数の作成方法も同じです。定義には「union」というキーワードを使用します。ただし、ある時点で実際に値が格納されているのは1つのメンバーだけである点に注意が必要です。
共用体の基本構文
union union_name {
member definition;
} union_variables;
- union_name:共用体につける任意の名前
- member definition:メンバー変数の定義群
- union_variable:共用体型のオブジェクト(変数)
共用体の使用例
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
} data, data1;
int main( ) {
printf("data が占有するメモリサイズ : %d\t%d", sizeof(data), sizeof(data1));
return 0;
}
実行結果
data が占有するメモリサイズ : 4 4
この例では、int型とfloat型の2つのメンバーを持つ共用体を定義しています。どちらのメンバーも4バイトなので、共用体全体のサイズは最も大きなメンバーである4バイトになります。
構造体と共用体の主な違いまとめ
| 項目 | 構造体(struct) | 共用体(union) |
|---|---|---|
| キーワード | struct | union |
| メモリ割り当て | 各メンバーが個別のメモリを持つ | 全メンバーが同一のメモリを共有 |
| サイズ | 全メンバーのサイズの合計 | 最大メンバーのサイズ |
| 同時に格納できる値 | すべてのメンバーに同時に値を保持可能 | 一度に1つのメンバーのみ有効 |
| 用途 | 関連する異種データを1つにまとめる | メモリ節約や多様な型でのデータ解釈 |
このように、構造体は複数のデータを同時に保持したい場合に、共用体はメモリを効率的に使いたい場合や、同じデータを異なる型として解釈したい場合に活用すると効果的です。
-
C#におけるクラスと構造体の違いを徹底解説
C#におけるクラスと構造体の基本的な違い クラス(Class)と構造体(Struct)を正しく使い分けるためには、まず両者が「データの定義と保持」という点において、ほぼ同等の役割を果たすことを理解しておく必要があります。どちらもデータメンバーを定義し、既定値を保持することが可能です。しかしそれ以外の側面、たとえばメモリ管理や継承といった機能面で比較すると、クラスの方が構造体よりも柔軟性が高く、より多くの機能を提供しています。 以下の表に、クラスと構造体の重要な違いを6つの観点からまとめました。 番号項目クラス構造体 1データ型クラスで定義されたデータは、メモリ上に参照として格納され、ア
-
C#のHashtableとDictionaryの違いとは?特徴と使い分けを徹底解説
C#では、データを「キー」と「値」のペア(Key/Value)で格納できるコレクションとして、HashtableとDictionaryの2つがよく使われます。一見似ていますが、型の制約やパフォーマンス、エラー処理などに重要な違いがあります。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。 HashtableとDictionaryの主な違い 項目HashtableDictionary 定義System.Collections名前空間に属する非ジェネリック(non-generic)コレクション。キーと値のペアでデータを格納します。System.Collect