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

C言語における構造体と共用体の違いを具体例付きでわかりやすく解説

はじめに

C言語には、異なるデータ型の値をひとまとまりとして扱うための仕組みとして、「構造体」と「共用体」の2つが用意されています。どちらも宣言の書き方はよく似ていますが、メモリの確保方法や使い方がまったく異なります。

本記事では、構造体と共用体の違いを比較表とサンプルコードで解説し、あわせて使い分けのポイントも紹介します。

構造体と共用体の違い一覧

項目構造体共用体
定義 異なるデータ型の項目を、1つの名前のもとにまとめた集合体です。 異なるデータ型の複数の変数が、同一のメモリ領域を共有するデータ構造です。
キーワード struct union
基本構文
struct tagname {
    datatype member1;
    datatype member2;
    ......
};
union tagname {
    datatype member1;
    datatype member2;
    ......
};
記述例
struct sample {
    int a;
    float b;
    char c;
};
union sample {
    int a;
    float b;
    char c;
};
メモリ割り当て 全メンバーのサイズの合計分(+アライメント調整のためのパディング)のメモリが確保されます。 全メンバーの中で最大のサイズを持つメンバー1つ分のメモリのみ確保されます。
メモリの共有 各メンバーに個別のメモリ領域が割り当てられ、すべてのメンバーを同時に保持できます。 任意の時点でメモリ上に有効なメンバーは1つだけです。

サンプルプログラム1:構造体の場合

以下は、構造体のサイズを sizeof 演算子で確認するC言語のプログラムです。

#include <stdio.h>

struct size {
    double a;   /* 8バイト */
    int b;      /* 4バイト */
    char c;     /* 1バイト */
    float d;    /* 4バイト */
};

int main(void) {
    printf("%ld", sizeof(struct size));
    return 0;
}

実行結果

24

メンバーのサイズを単純に足すと 8+4+1+4=17 バイトですが、実際には 24 バイトとなります。これは、CPUがデータへ効率よくアクセスできるよう、コンパイラがパディング(詰め物)を挿入してアライメント(境界整列)を調整するためです。構造体では、このように全メンバー分のメモリが個別に確保されます。

サンプルプログラム2:共用体の場合

次に、同じメンバー構成を持つ共用体のサイズを確認してみましょう。

#include <stdio.h>

union size {
    double a;   /* 8バイト */
    int b;      /* 4バイト */
    char c;     /* 1バイト */
    float d;    /* 4バイト */
};

int main(void) {
    printf("%ld", sizeof(union size));
    return 0;
}

実行結果

8

共用体では、すべてのメンバーが同じメモリ領域を共有するため、必要なサイズは最大のメンバー(double型の8バイト)だけで済みます。そのため、結果は 8 バイトになります。

使い分けのポイント

  • 構造体:氏名・年齢・身長のように、複数の情報を同時に保持したい場合に適しています。
  • 共用体:同じメモリ領域を別の型として読み書きしたい場合や、組み込み開発などメモリ資源が限られた環境での省メモリ化に役立ちます。
  • 共用体では「最後に代入したメンバーの値だけが有効」になるため、異なるメンバーへ続けて代入すると以前の値は失われる点に注意が必要です。

まとめ

構造体と共用体はどちらも複数のメンバーを持てる点で共通していますが、構造体は全メンバー分のメモリを個別に確保して同時に扱えるのに対し、共用体は全メンバーで1つのメモリ領域を共有するという点が最大の違いです。この特性を理解したうえで用途に応じて使い分ければ、より安全で効率的なプログラムを作成できます。

  1. C言語の定数(const)とは?基本構文から種類・実行例まで徹底解説

    定数(Constant)とは、一度値を定義するとプログラムの実行中にその値が一切変わらないものを指します。固定値を参照するために、変数を定数として宣言することができます。定数は「リテラル」と呼ばれることもあります。C言語では、const キーワードを使用して定数を定義します。定数の基本構文C言語で定数を宣言する際の基本的な構文は以下の通りです。const 型 変数名; または const 型 *ポインタ変数名;定数の主な種類C言語で扱われる定数には、以下のような種類があります。整数定数 … 例:1、0、34、4567浮動小数点定数 … 例:0.0、156.89、23.4568進数・16進数定数

  2. iCloud+の「メールを非公開」と「Appleでサインイン」の違いとは?使い分けのポイントを解説

    Appleは、アプリやウェブサイトでアカウント登録をする際にメールアドレスを隠せる「メールを非公開(Hide My Email)」機能を、ユーザーのプライバシー保護強化の一環として導入しました。しかし、この機能には2つの提供形態があります。それが「Appleでサインイン」と「iCloud+」です。どちらも同じ機能名ですが、それぞれで動作や使い方が少し異なります。 この記事では、2つのサービスにおける「メールを非公開」の違いと、どちらを選ぶべきかの判断基準をわかりやすく解説します。 「メールを非公開」機能でできること 「メールを非公開」を使うと、アカウント作成やオンラインフォームへの入力時に、ラ