構造体は、可変長オブジェクトのヘッダである場合、これは場合に特に有用です。これはまさに私の場合です。さらに、私はヒープ内の私の構造体の整列に懸念しています。
この場合、私はまだゼロ長配列について何が役に立つのか分かりません。この特定の状況とはどのように関係していますか?
EDIT:
が、私はそこにしたいと私は同じくらい、「データ」を置くことができるということですか?
構造体は、可変長オブジェクトのヘッダである場合、これは場合に特に有用です。これはまさに私の場合です。さらに、私はヒープ内の私の構造体の整列に懸念しています。
この場合、私はまだゼロ長配列について何が役に立つのか分かりません。この特定の状況とはどのように関係していますか?
EDIT:
が、私はそこにしたいと私は同じくらい、「データ」を置くことができるということですか?
基本的にそれはあなたが最後に可変長配列した構造を持つことができます:
struct X {
int first;
int rest[0];
};
Cは本当にあなたが配列の末尾を超えて要素にアクセスしていることを気にしないので、あなただけの開始します
struct X *xp = (struct X *)malloc(sizeof(struct X)+10*sizeof(int));
xp->rest[9] = 0;
うーん、本当に両方の問題に関連している。 – darksky
説明はありますが、 '[0]'(gcc拡張子)ではなく[[] '(gccでもC99でサポートされています)または' [1] '少なくともあなたに定義された動作を与えます。 –
メモリを使用すると、長さゼロの配列メンバを持つ構造体へのポインタに代入しますmalloc()
から返された:その後、大きさゼロの配列、及びであなたが実際にしたいしかし、多くの要素を処理するために十分なメモリを割り当てます揃うd memory ...これはC99仕様で必要とされています。だから、ヒープから割り当てられたメモリの上に長さゼロの配列を持つ構造体をmalloc()
でオーバーレイすることに問題はありません。
問題が発生するのは、ファイルヘッダやメモリマップされたハードウェアインタフェースなど、パックされたデータソースまたは非伝統的にアライメントされたデータソースに由来するメモリの一部のローバッファに構造体をオーバーレイしようとした場合です。そのような場合、長さがゼロの配列を使用して可変長データを処理することは悪い考えです。なぜなら、データはプラットフォームのデフォルトのアラインメントパラメータに従って整列されない可能性があります。正しい結果。
私は実際に 'malloc()'を実装しています。そのため、私は自分自身の整列について心配しています。 – darksky
'mmap'を通して' malloc'をどのように実装していますか?ある時点で、あなたはOSからメモリを要求しなければならなくなります...そのメモリは整列されます。非伝統的に整列されたメモリは、パックされた、または "ローバッファ"のデータソース、メモリマップされたハードウェアインターフェイスなどのようなものです。私が "非伝統的"と言うとき、私はバッファ'int'、' char'などで構成されているかもしれません。これらの要素を含む 'struct'を単純に作ることはできず、バッファにオーバーレイし、オーバーレイを妨げるためにコンパイラによって追加されたパディング操作。 – Jason
http://stackoverflow.com/search?q=struct+hack+[c]&submit=search – dmckee
このgcc拡張機能を使用しないでください。 C99以降のフレキシブルな配列の正しい構文は、 '[0]'ではなく 'struct'の最後のメンバーの' [] 'の空のペアです。 GCCはこの記法もサポートしています。 –