1. ホーム
  2. c

[解決済み] 構造体のメンバーの順番は重要か?

2023-08-02 06:21:48

質問

C言語において奇妙な挙動を発見しました。

 struct s {
     int a;
 };      

 struct z {
     int a;
     struct s b[];
 };  

 int main(void) {
     return 0;
 }   

うまくコンパイルできました。次に、構造体のメンバの順番を変えて z のように変更します。

struct z {
    struct s b[];
    int a; 
};  

そして突然、コンパイルエラーが発生しました。 field has incomplete type 'struct s []' .

なぜなんでしょう?

どのように解決するのですか?

のフィールドの順番は struct のフィールドの順番は重要です。コンパイラはフィールドの順番を変更することはできないので、その場合は struct のサイズは、パディングを追加した結果、変更される可能性があります。

しかし、この場合、いわゆる フレキシブルメンバ と呼ばれる、サイズを変更できる配列を定義しています。フレキシブルメンバーに関するルールは以下の通りです。

  • そのようなメンバは1つだけであってはならない。
  • 存在する場合、柔軟なメンバは struct でなければならず、また
  • struct は、フレキシブルなメンバーに加えて、少なくとも1つのメンバーを持つ必要があります。

を見てみましょう。 この Q&A をご覧ください。