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

C言語でメンバーを持たない構造体を宣言する方法とそのサイズ


問題

C言語では、メンバー(要素)を一切持たない構造体を宣言することはできるのでしょうか?また、宣言が可能な場合、その構造体のサイズはどのようになるのでしょうか?

解答

結論から言うと、C言語ではメンバーを1つも持たない構造体を宣言することが許されています。この場合、その構造体のサイズは0(ゼロ)バイトとなり、いわゆる「ゼロサイズの構造体」になります。

サンプルコード

#include <stdio.h>
// メンバーを持たない構造体
struct temp{
};
int main(){
    // 構造体変数の宣言
    struct temp T;
    printf("Size of T: %d\n", sizeof(T));
    return 0;
}

実行結果

このプログラムでは、「temp」という名前の構造体を宣言していますが、内部には何も変数(メンバー)を定義していません。そのため、「temp」はメンバーを持たない空の構造体となります。

続いて、main関数内で構造体変数「T」を宣言し、sizeof演算子を使って「T」が占有するサイズを出力しています。実行すると、結果は「0」と表示されます。

Size of T: 0

補足:コンパイラによる扱いの違い

なお、ISO標準規格上は空の構造体の定義は厳密には認められていませんが、GCCなどの主要なコンパイラでは拡張機能としてサポートされており、上記のようにサイズ0の構造体として扱われます。ただし、コンパイラによっては警告が出たり、エラーになったりする場合もあるため、移植性を重視するコードでは注意が必要です。


  1. 【C言語入門】線形データ構造「キュー」の基本概念と実装方法をわかりやすく解説

    データ構造とは、データを体系的に整理して格納するための仕組みのことです。データ構造は大きく分けて以下の2種類に分類されます。線形データ構造 − データが一列に直線状に並んで格納される構造です。例:配列、構造体、スタック、キュー、連結リストなど。非線形データ構造 − データが階層的・網羅的に格納される構造です。例:木(ツリー)、グラフ、集合、テーブルなど。キュー(Queue)とはキューは線形データ構造の一つで、要素の挿入は後端(リア/rear)から行い、削除は前端(フロント/front)から行うという特徴を持っています。キューではFIFO(First In First Out:先入れ先出し)とい

  2. 構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説

    ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型