0

ウィキペディアでリンクされているこのバージョンの C99 標準を読んで、柔軟な配列メンバーがどのように機能するかを理解しようとしました。

セクション 6.7.2.1 で、この構造体は次のように宣言されました。

struct s { int n; double d[]; };

そして例が与えられました:

s1 = malloc(sizeof (struct s) + 10);
s2 = malloc(sizeof (struct s) + 6);

それがそう言っていてs1s2宣言が次のように振る舞うところ:

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と言う理由がわかりません:s1s2

struct { int n; double d[1]; } *s1, *s2;

s2その構造体を格納するのに十分なメモリが割り当てられていないように見える場合。

このドキュメントはある種の下書きのように見えるので、エラーがあったのか、それとも意味を誤解しているのかはわかりません。

4

2 に答える 2

1

(もう C99 を調べる必要はありません。廃止されました。C11 は、あなたが引用しているのと同じ場所にあるドキュメント n1570 です。おそらく/うまくいけば、すぐに C17 に置き換えられます。)

1つの要素を持っているかのように振る舞うと言われている理由は、

要素がない場合、そのような配列は要素が 1 つあるかのように動作しますが、その要素にアクセスしようとすると動作は未定義です...

于 2018-04-01T12:57:32.373 に答える