2

IPヘッダーを表す構造体を持っています

struct IPHDR // the ip header
{
    unsigned char VER : 4;
    unsigned char IHL : 4;
    unsigned char DSCP : 6;
    unsigned char ECN : 2;
    unsigned short len;
    unsigned short id;
    u_char Reserved:1; //Zeroes
    u_char DF:1; //Dont Fragment
    u_char MF:1; //More Fragment
    unsigned short FragOffset : 13;
    u_char ttl;
    u_char protocol;
    u_short checksum;
    struct in_addr src;
    struct in_addr dst;
} ;

sizeof(IPHDR) は 20 を返すはずなのに 24 を返します。何が問題なのですか?

4

2 に答える 2

3

This is because your structure gets padded to overcome this you could use a #pragma pack compiler directive like so:

#pragma pack(push)
#pragma pack(1)
struct IPHDR // the ip header
{
   unsigned char VER : 4;
   unsigned char IHL : 4;
   unsigned char DSCP : 6;
   unsigned char ECN : 2;
   unsigned short len;
   unsigned short id;
   u_char Reserved:1; //Zeroes
   u_char DF:1; //Dont Fragment
   u_char MF:1; //More Fragment
   unsigned short FragOffset : 13;
   u_char ttl;
   u_char protocol;
   u_short checksum;
   struct in_addr src;
   struct in_addr dst;
 } ;
 #pragma pack(pop)

Read more about padding and alignment: Data structure alignment

于 2013-07-07T13:10:35.567 に答える
1

これは、構造体がメモリ アライメントを強制されているためです。つまり、構造体の合計サイズは、構造体メンバーの最大アライメントの倍数でなければなりません。この要件は、プロセッサが単一バイトではなくワードチャンクでメモリを読み取るという事実に由来します。メモリ アラインメントは最新のプロセッサの限界であると言う人もいます。通常は、1 つの効率的なワード フェッチではなく、4 つの非効率なシングル バイト フェッチを実行することで回避できますが、多くの言語指定子は、それらを非合法化し、すべてを強制する方が簡単であると判断しました。合わせます。

通常、構造内のフィールドのシーケンスを再実装することにより、構造の異なる配置とサイズを実現できます。

提供されたリンクから:

構造体メンバーを並べ替えるか、構造体メンバーのコンパイラーの配置 (または「パッキング」) を変更することにより、構造体の配置を変更して必要なメモリを減らす (または既存の形式に準拠させる) ことができます。

于 2013-07-07T13:25:23.913 に答える