GCCのZero Length Arrayの説明を参照してください:
これは、構造体が可変長オブジェクトのヘッダーである場合に特に役立ちます。これはまさに私の場合です。さらに、ヒープ内の構造体の配置にも関心があります。
この場合、長さゼロの配列の何が便利なのか、まだよくわかりません。彼らはこの特定の状況にどのように関連していますか?
編集:
そこに好きなだけ「データ」を入れることができるということですか?
GCCのZero Length Arrayの説明を参照してください:
これは、構造体が可変長オブジェクトのヘッダーである場合に特に役立ちます。これはまさに私の場合です。さらに、ヒープ内の構造体の配置にも関心があります。
この場合、長さゼロの配列の何が便利なのか、まだよくわかりません。彼らはこの特定の状況にどのように関連していますか?
編集:
そこに好きなだけ「データ」を入れることができるということですか?
基本的に、最後に可変長配列を持つ構造を持つことができます:
struct X {
int first;
int rest[0];
};
配列サイズ 0 は実際には有効ではありません (ただし、gcc 拡張機能として許可されています)。サイズを指定しないのが正しい方法です。C は、配列の末尾を超えて要素にアクセスしていることをあまり気にしないため、未定義の配列サイズから始めて、実際に必要な数の要素を処理するのに十分なメモリを割り当てます。
struct X *xp = (struct X *)malloc(sizeof(struct X)+10*sizeof(int));
xp->rest[9] = 0;
malloc()
長さゼロの配列メンバーを持つ構造体へのポインターに割り当てることから返されるメモリは、アラインされたメモリになります...これはC99仕様で必要です。したがって、 を介してヒープから割り当てられたメモリ上に長さ 0 の配列を持つ構造体をオーバーレイしても問題はありませんmalloc()
。
問題が発生するのは、ファイルヘッダー、メモリマップされたハードウェアインターフェイスなど、パックされた、または従来とは異なるデータソースからのメモリ内の生のバッファに構造体をオーバーレイしようとする場合です。場合によっては、長さゼロの配列を使用して可変長データを処理することは、プラットフォームのデフォルトの配置パラメーターに従ってデータが配置されない可能性があり、配列にオフセットしても正しい結果が得られない可能性があるため、悪い考えになる可能性があります。