先寫一個小程序:
#include<stdio.h>
struct student
{
int a;
char k;
short m;
};
int main()
{
struct student pp={45,'a',1};
short *m=(short *)((int)&pp+6); // 偏移量+6
printf("m=%d.\n",*m);
printf("sizeof(pp)=%d.\n",sizeof(struct student));
return 0;
}
測出結構體的大小爲8
輸出*m=1;
由此能夠看出數據如何在內存中存儲的。
int型4字節 ,char型 1字節,short型2字節。
應該爲7字節,因爲內存對齊 8字節。char 型數據存完後的空間1字節被填充了,short 在第7,8字節裏存儲。(這是編譯器本身作的)
1)結構體每一個成員相對結構體首地址的偏移量(offset)是對齊參數的整數倍,若有須要會在成員之間填充字節。編譯器在爲結構體成員開闢空間時,首先檢查預開闢空間的地址相對於結構體首地址的偏移量是否爲對齊參數的整數倍,如果,則存放該成員;若不是,則填充若干字節,以達到整數倍的要求。小程序
2)結構體變量所佔空間的大小是對齊參數大小的整數倍。若有須要會在最後一個成員末尾填充若干字節使得所佔空間大小是對齊參數大小的整數倍。spa