>これは、この構造体の例よりも もっと合法な使い方である、
>単なる可変長配列を realloc() した場合にも起きる問題ですね。
うーん、たとえば折れ線を表現するときに、
typedef struct {
int point_count;
Point *point;
} Polyline;
typedef struct {
int point_count;
Point point[1];
} Polyline;
というふたつの実現方法があって、どちらを使うかを考えたとき、
後者の方法だと、pointの数を増減させるたびにPolylineのアドレスが
変わってしまう、ということを言いたかったのですが。
確かにどちらもrealloc()すればpointの指すアドレスは変わりますが、
「pointはPolyline以外誰も指してないけど、Polylineを指してる奴は
いっぱいいる」というケースはたぶんたくさんあって、後者の方が
危険度がかなり高いと思います(程度問題にせよ)。
>この手法は、C99 で合法化されたと考えて良いと思います。
>以下参照:
>
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
これはそうですね。
そういえばGCCにも、point[0]と書ける拡張機能がありました。