2011-12-16 92 views
3

可能重複:
How do I find the size of a struct?
Struct varies in memory size?C結構尺寸不一致

我使用以下用於網絡通信的結構,它創建地段之間的不必要的字節。

它給出了不同的大小比預期的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; 
    } 

並按照給即使是我從工會

struct HttpPacket { 
      unsigned char x1; 
      union { 
      struct { 
       unsigned char len; 
       unsigned short host; 
       unsigned char content[4]; 
      } packet; 
      unsigned long num; 
     } 

還刪除字段大小不同,一個更明顯的例子

struct { 
       unsigned char len; 
       unsigned short host; 
       unsigned char content[4]; 
      } packet; 

而且它提供了大小爲8,而不是7. 而且我再添加一個字段,它仍然給出相同的大小

struct { 
       unsigned char EXTRAADDEDFIELD; 
       unsigned char len; 
       unsigned short host; 
       unsigned char content[4]; 
      } packet; 

可有人請有關解決此問題的幫助?

更新:我需要在發送數據包來保存格式,所以我想跳過這些墊襯

+0

我需要傳輸數據包時保存的格式,所以我想跳過這些填充 – coder000001 2011-12-16 20:05:27

+0

在XCode 4上需要此LLVM編譯器 – coder000001 2011-12-16 20:10:03

+0

但是,我需要針對XCode 4新LLVM編譯器的解決方案。 – coder000001 2011-12-16 20:16:02

回答

7

聽說過的alignment and padding

基本上,爲了確保快速訪問,某些類型必須位於某些內存地址範圍內。
這被稱爲對齊。

爲了達到這個目的,允許編譯器在您的數據結構中插入字節以實現對齊。
這被稱爲填充。

10

C不保證struct的尺寸。編輯器可以根據需要排列成員。通常,在這種情況下,由於大多數機器上的速度最快,因此它將使字號對齊。

2

默認情況下,結構字段在自然邊界上對齊。例如,一個4字節的字段將在4字節的邊界上開始。編譯器插入填充字節來實現這一點。您可以使用#pragma pack(0)或其他類似的編譯器指令來避免填充

0

如果您有C99編譯器並且可以使用「新」固定寬度類型:創建一個uint8_t的數組,然後執行分隔成員自己。

uint8_t data[8]; 

x1 = data[0]; 
len = data[1]; 
host = data[2] * 256 + data[3]; /* big endian */ 
content[0] = data[4]; 
content[1] = data[5]; 
content[2] = data[6]; 
content[3] = data[7]; 

/* ... */ 

您可以按照C89相同的過程,如果你能依靠CHAR_BIT爲8。