C99 標準では、次のような柔軟な配列メンバーを作成できます。
typedef struct pstring {
size_t length;
char string[];
} pstring;
これは、次のようなもので初期化されますpstring* s = malloc(sizeof(pstring) + len)
。len
をゼロにすることは許されますか? それは一貫しているように見え、時々スペースを節約するのに適しています(pstring
もちろん、おそらく例ではありません)。一方、次のコードが何をするのかわかりません。
pstring* s = malloc(sizeof(pstring));
s->string;
これはまた、あるコンパイラーでは動作するが別のコンパイラーでは動作しない、またはある OS では動作し、別の OS では動作しない、またはある日と別の OS では動作しないようなものであるように思われるので、私が本当に知りたいのは、標準がこれについて何を述べているかです。それmalloc
はサンプルコードの未定義の動作s->string
ですか、それとも無効なアクセスのみですか、それともまったく別のものですか?