最近遇到一個題目是關於回答結構體成員變量地址偏移量的,實際運行的時候出乎我本身的想象!測試
看看如下結構體實例truct:基礎
struct trc{
char char_i;
short short_i;
int int_i;
long long_i;
char char_j;
int int_j;
} truct;變量
首先,我天然地認爲,char佔用一個字節,short佔用2個字節,int佔用4個字節,因此long會佔用8個字節,沒錯吧?可是在個人嵌入式MIPS上運行測試程序能夠知道long實際上只是佔用4個字節!程序
而後假設結構體truct的地址是0x30000000,那麼它也是truct.char_i的地址,truct.short_i的地址是0x30000001,以此類推,0x30000003,0x30000003, 0x30000007,0x3000000b, 0x3000000c。但實際運行的結果倒是truct.short_i的地址爲0x30000002,truct.int_i的地址爲0x30000004,truct.long_i的地址爲0x30000008,truct.char_j的地址爲0x3000000c,truct.int_j的地址爲0x30000010。因此是,原本覺得short_i的地址偏移量是1,但結果倒是2;原本覺得int_j的地址偏移量是在char_j的地址偏移量基礎上加上1,結果倒是加上4。網上查了一下,才發現結構體存儲變量的地址對齊有兩個規則:1.結構體中成員變量的地址偏移量必須是該成員大小的整數倍 2.結構體大小必須是全部成員大小的整數倍。因此是,因爲short_i佔用2個字節,因此它的地址偏移量不能是1,而應該是2;因爲int_j佔用4個字節,因此char_j的地址偏移量加上4做爲4的整數倍,才能是int_j的地址偏移量。按照該原則,整個結構體的大小必須是4的整數倍。目前的結構體大小是20。若是我把int_j的類型改成char,結果int_j的偏移量變成了0x3000000d,而結構體的大小變成了16,而不是12(後面填充了4個字節)。嵌入式