關於結構體中成員變量的地址偏移量


最近遇到一個題目是關於回答結構體成員變量地址偏移量的,實際運行的時候出乎我自己的想象!

看看以下結構體實例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個字節)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM