8

柔軟な配列メンバーに関連するいくつかの投稿を読んだ後でも、なぜそのような機能が必要なのか、まだ完全には理解できません。

重複の可能性:
C の柔軟な配列メンバー - 悪い?
これはCでも柔軟な配列構造体のメンバーですか?

(上記の重複する可能性のある質問から問題を解決できなかった場合は、私を責めてください)

次の 2 つの実装の実際の違いは何ですか。

struct h1 {
    size_t len;
    unsigned char *data;
};

struct h2 {
    size_t len;
    unsigned char data[];
};

h2 のサイズは、柔軟な配列メンバー (データ) が省略されたかのように、つまりsizeof(h2) == sizeof(size_t). また、柔軟な配列メンバーは構造体の最後の要素としてのみ表示できることも知っているため、元の実装は の位置でより柔軟になる可能性がありdataます。

私の本当の問題は、なぜ C99 がこの機能を追加するのかということです。sizeof(h2) にデータの実際のサイズが含まれていないという理由だけですか? この機能について、さらに重要な点をいくつか見逃しているに違いありません。私のためにそれを指摘してください。

4

3 に答える 3

10

あなたの投稿の 2 つの構造体は、まったく同じ構造を持っていません。h1整数と char へのポインタを持ちます。h2整数とインラインの文字配列(実行時に決定される要素の数、場合によってはなし) を持ちます。

別の言い方をするとh2、文字データは構造体の中にあります。そのh1中には、どこか外にある必要があります。

これは大きな違いを生みます。たとえば、使用h1する場合は、(構造体自体に加えて) ペイロードの割り当て/解放に注意する必要があります。ではh2、割り当て/無料は 1 つだけで済み、すべてがパッケージ化されています。

の使用が理にかなっているケースの 1 つは、ペアh2の形式でメッセージを期待するものと通信している場合です。をリクエストし{length,data}て のインスタンスを割り当て、それを埋めると、すべてを 1 回で転送できます(もちろん、エンディアンなどに注意してください)。を使用していた場合は、2 つの呼び出しが必要になります (データのメモリ アドレスを送信する場合を除きますが、通常は意味がありません)。h2sizeof(h2)+how many payload chars you wantwriteh1write

この機能が存在するのは、便利だからです。そして、この機能をシミュレートするために、その前に使用されたさまざまな (場合によっては移植できない) トリック。それを標準に追加することは理にかなっています。

于 2013-12-01T08:37:36.380 に答える
7
于 2013-12-01T08:39:51.343 に答える