ウィキペディアでリンクされているこのバージョンの C99 標準を読んで、柔軟な配列メンバーがどのように機能するかを理解しようとしました。
セクション 6.7.2.1 で、この構造体は次のように宣言されました。
struct s { int n; double d[]; };
そして例が与えられました:
s1 = malloc(sizeof (struct s) + 10);
s2 = malloc(sizeof (struct s) + 6);
それがそう言っていてs1
、s2
宣言が次のように振る舞うところ:
struct { int n; double d[1]; } *s1, *s2;
そして、できることをいくつかリストしました:
double *dp;
dp = &(s1->d[0]); // valid
*dp = 42; // valid
dp = &(s2->d[0]); // valid
*dp = 42; // undefined behavior
double を格納するには不十分な 6 バイトしか割り当てられていないため、上記の最後の行が未定義である理由はわかりますが、 andの動作が次のように宣言された場合のようになるs2
と言う理由がわかりません:s1
s2
struct { int n; double d[1]; } *s1, *s2;
s2
その構造体を格納するのに十分なメモリが割り当てられていないように見える場合。
このドキュメントはある種の下書きのように見えるので、エラーがあったのか、それとも意味を誤解しているのかはわかりません。