プログラミング言語 C の新機能 Part XXI: ARR#1:構造体中の0長配列メンバ
(1999/07/26 [月])
プログラムを組んでいるとよくあるパターンの一つとして、可変長の配列を含んだ構造体が必要になることがありました。例えば以下のコードが挙げられます。
この記述では、sizeof(info_t) は 多くの場合、attr, num, items[1] の大きさの合計を返します。だから、例えば、items が一つもいらなかった場合に対応するために、sizeof で大きさをとる時には、たいていその要素から num-1 といったように 1 を引く必要がありました。これは、書くのが面倒な上、さらに後からプログラムを見る時にもわかりにくい記述方法となっていました。今度の C 言語では、[ ] の中の大きさを、構造体の最後のメンバである時に限って省略することができるようになりました。例えば、次のように書くことができます。
この書き方を用いれば、sizeof が返す値が、attr と num の合計になります。しだがって、ただ単純に num をかけるだけで必要な要素のメモリを確保することができます。その結果として、見た目にもすっきりした形態で記述できます。
typedef struct { int attr; int num; int items[1]; } info_t; ... info_t *info = malloc(sizeof(info_t) + sizeof(int) * (num-1)); info->num = num; ... |
この記述では、sizeof(info_t) は 多くの場合、attr, num, items[1] の大きさの合計を返します。だから、例えば、items が一つもいらなかった場合に対応するために、sizeof で大きさをとる時には、たいていその要素から num-1 といったように 1 を引く必要がありました。これは、書くのが面倒な上、さらに後からプログラムを見る時にもわかりにくい記述方法となっていました。今度の C 言語では、[ ] の中の大きさを、構造体の最後のメンバである時に限って省略することができるようになりました。例えば、次のように書くことができます。
typedef struct { int attr; int num; int items[ ]; } info_t; ... info_t *info = malloc(sizeof(info_t) + sizeof(int) * num); info->num = num; ... |
この書き方を用いれば、sizeof が返す値が、attr と num の合計になります。しだがって、ただ単純に num をかけるだけで必要な要素のメモリを確保することができます。その結果として、見た目にもすっきりした形態で記述できます。
by seclan