3

http://c-faq.com/strangeprob/ptralign.html

16.7 で、著者は次のように説明しています。

s.i32 = *(long int *)p;
s.i16 = *(int *)p;

これらのキャストされたポインタが整列されていない可能性があるため、問題が発生します。したがって、彼は解決策の代わりにバイト単位の操作を使用します。

私の質問は、このコード以来です:

struct mystruct {
    char c;
    long int i32;
    int i16;
} s;

'char c;' の後にパディング バイトがありますが、作成者が 'long int i32;' を取得しようとしたときにパディングをスキップしなかったのはなぜですか?

4

1 に答える 1

1

これは FAQ リストであることを忘れないでください。QAは別の人が書いたかのように読まなければなりません。理論的には、Qは、答えを知らない人から実際によく聞かれるものです。実際には、実際の質問からの直接の引用ではなく、FAQ リストの管理者によって作成された質問の一種の理想化されたバージョンです。それでも、Qセクションを書くとき、著者は別のペルソナを採用します。

この場合、質問するペルソナは配置やパディングについて知りません。彼は構造体定義を書きchar buf[7]、両方とも 7 バイトの長さであるべきだと考えています。7 バイトのバッファーは、質問者が解析しようとしている外部データ形式 (ファイルまたはネットワーク プロトコル ストリーム内) であり、構造体は解析対象の変数を表し、次のようなステートメントs.i32 = *(long int *)p;は失敗した試みです。している。

Aセクションで、作成者はそのペルソナを削除し、パックされた 7 バイトのバッファーから構造体にデータを転送する正しい方法を示します。彼は答えを簡潔にしたいので、struct と char バッファーに適用されるアラインメントとパディングの規則のすべての詳細を説明しません。

あなたが見ているのは、人々が頻繁に尋ねる質問に実際に答えるように設計された、真に古いスタイルのニュースグループの FAQ リストであり、マーケティング チームがお世辞を言うように設計された偽の質問を作成する企業 Web サイト スタイルの「FAQ」ではありません。苦情への回答は避けてください。(そして、単一の質問である FAQ と、回答を含む FAQ リストである FAQL との間に区別があったことを覚えている人はいますか? それはどこに行ったのですか?)

于 2012-07-28T19:27:47.600 に答える