Posted at

可変長オブジェクト in C

More than 3 years have passed since last update.

C言語gnu拡張の説明を読んでいたら出てきたので。


可変長オブジェクトとは

こんなやつである。(gccドキュメント 6.17 Arrays of Length Zeroより引用)

     struct line {

int length;
char contents[0];
};

char配列の要素数が0である。これはC言語gnu拡張のひとつ。

ISO C では配列の要素数は1以上でなければならない。

さて、これをどうやって使うのか。

とりあえずドキュメントから引用する。

     struct line *thisline = (struct line *)

malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

1,2行目で構造体lineを確保している。

面白いのは、this_lengthで領域を余分にもらっていることだ。

この、余分にもらった分はchar contents[0]の領域として使える。

つまり、実質的にはchar contents[this_length]として働くわけだ。

0要素の配列で宣言していないと、意図しない余計な領域を食う羽目になる。

何とかしようとするとmallocの引数が複雑になる。

それを避けるための拡張、というわけらしい。

3行目では、lengthに要素数を代入している。

単純に配列の長さを取っておくだけだ。


感想

構造体の中身からは「いかにも可変長」っぽさが伝わってこないのでこわい。

C++のstd::vectorとかで書いて邪悪さを減らせないものか。