C结构大小不一致

cod*_*001 2 c c++ struct sizeof

可能重复:
如何找到结构的大小?
结构的内存大小不同?

我使用以下结构进行网络通信,它在中间创建了许多不必要的字节.

它提供的大小与预期的8字节不同.

struct HttpPacket {
  unsigned char x1;
  union {
        struct {
           unsigned char  len;
           unsigned short host;
           unsigned char content[4];
        } packet;
        unsigned char bytes[7];
        unsigned long num;
    }
Run Code Online (Sandbox Code Playgroud)

并且以下给出了不同的大小,即使我从联合中删除了一个字段

struct HttpPacket {
             unsigned char x1;
             union {
            struct {
               unsigned char  len;
               unsigned short host;
               unsigned char content[4];
            } packet;
            unsigned long num;
        }
Run Code Online (Sandbox Code Playgroud)

另外,一个更明显的例子

struct {
               unsigned char  len;
               unsigned short host;
               unsigned char content[4];
            } packet;
Run Code Online (Sandbox Code Playgroud)

它的大小为8,而不是7.我再添加一个字段,它仍然给出相同的大小

struct {
               unsigned char  EXTRAADDEDFIELD;
               unsigned char  len;
               unsigned short host;
               unsigned char content[4];
            } packet;
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙解决这个问题吗?

更新:我需要在传输数据包时保持格式,所以我想跳过这些填充

Kev*_*vin 10

C不保证a的大小struct.允许编译器按照它想要的顺序排列成员.通常,就像在这种情况下一样,它会使大小字对齐,因为这在大多数机器上都是最快的.


Xeo*_*Xeo 7

有没有听说过对齐和填充

基本上,为了确保快速访问,某些类型必须在内存地址的某些边界上.
这称为对齐.

为此,允许编译器将字节插入到数据结构中以实现该对齐.
这称为填充.