C++
 Computer >> コンピューター >  >> プログラミング >> C++

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)
キーワードstructunion
メモリ割り当て各メンバーが個別のメモリを持つ全メンバーが同一のメモリを共有
サイズ全メンバーのサイズの合計最大メンバーのサイズ
同時に格納できる値すべてのメンバーに同時に値を保持可能一度に1つのメンバーのみ有効
用途関連する異種データを1つにまとめるメモリ節約や多様な型でのデータ解釈

このように、構造体は複数のデータを同時に保持したい場合に、共用体はメモリを効率的に使いたい場合や、同じデータを異なる型として解釈したい場合に活用すると効果的です。

  1. C#におけるクラスと構造体の違いを徹底解説

    C#におけるクラスと構造体の基本的な違い クラス(Class)と構造体(Struct)を正しく使い分けるためには、まず両者が「データの定義と保持」という点において、ほぼ同等の役割を果たすことを理解しておく必要があります。どちらもデータメンバーを定義し、既定値を保持することが可能です。しかしそれ以外の側面、たとえばメモリ管理や継承といった機能面で比較すると、クラスの方が構造体よりも柔軟性が高く、より多くの機能を提供しています。 以下の表に、クラスと構造体の重要な違いを6つの観点からまとめました。 番号項目クラス構造体 1データ型クラスで定義されたデータは、メモリ上に参照として格納され、ア

  2. C#のHashtableとDictionaryの違いとは?特徴と使い分けを徹底解説

    C#では、データを「キー」と「値」のペア(Key/Value)で格納できるコレクションとして、HashtableとDictionaryの2つがよく使われます。一見似ていますが、型の制約やパフォーマンス、エラー処理などに重要な違いがあります。本記事では、両者の違いを比較表とサンプルコードを使ってわかりやすく解説します。 HashtableとDictionaryの主な違い 項目HashtableDictionary 定義System.Collections名前空間に属する非ジェネリック(non-generic)コレクション。キーと値のペアでデータを格納します。System.Collect