#include
typedef struct
{
unsigned char a;
unsigned char b;
unsigned int c;
unsigned short d;
unsigned int e;
} ABC;
const unsigned short code1[6] = {0x1607,0x1003,0x1008,0x2001,0x3002,0x4003};
void main(void)
{
ABC * p = (ABC *)&code1[0];
printf("%X\n",p->c);
}
請問:輸出的是 0x20011008
為什麼不是0x10081003 ?
這個確實和字節對齊有關系,前提是編譯器是32-bit的。
在內存中映射的數據,是這樣的:
07 16 03 10 08 10 01 20 02 30 03 40
對於int型,每個占用4個byte,必須是4字節對齊。所以起始地址必須是4的倍數。這是編譯器優化的結果。
所以一般在定義結構體的時候,為了避免這個問題,我們往往會重新組織一下數據,進行4字節對齊:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned short d; d和c換一下位置。
unsigned int c;
unsigned int e;
} ABC;
如果不能交換位置,比如圖形文件的header,必須是字節一一對齊。那一般采用這個方式:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned char c[4];
unsigned char d[2];
unsigned char e[4];
} ABC;
然後根據平台的大小端轉換成正確的值