項目開發過程當中常常會遇到,同一個結構體在兩個工程中使用,好比api和後臺服務。爲了通訊一致,兩處固然要有徹底一致的結構體定義。
可是有時候,明明看到兩處結構體定義同樣,可是api傳過來的結構體,後臺服務解析(通常是強轉)出亂碼。後面通過仔細排查,纔看到後臺服務定義該結構體的頭文件中有以下代碼:api
#pragma pack (push,1) //設置1字節對齊 //結構體定義在此處。。。。 #pragma pack(pop) //取消1字節對齊
而在api的工程中,沒有像上面這樣來定義該結構體。兩處定義出現了不一致,致使解析出錯。
而上面代碼是什麼意思呢?
在缺省狀況下,C編譯器爲每個變量或是數據單元按其天然對界條件分配空間。通常地,能夠經過下面的方法來改變缺省的對界條件:spa
好比兩種結構體定義方式:code
struct sample1 { char a; int b; }; #pragma pack(push,1) struct sample2 { char a; int b; }; #pragma pack(pop)
單從字面上看,sizeof(sample1)==sizeof(sample2)。
實際上,結構體sample1按照天然對界對齊(按照int的長度,4字節對齊),sizeof(sample1)=4+4=8;
結構體sample2按照設定的對齊方式對齊(1字節對齊),sizeof(sample2)=1+4=5。
固然你把sample1強轉成sample2,會產生字節錯位,形成亂碼。這是一個經驗教訓,切記!!開發