遵守兩個原則
1.爲結構體變量的成員變量分配內存的起始地址必須爲成員變量內存長度的整數倍。
2.結構體變量內存的總大小必須爲sizeof(結構體成員變量)(最大的)的整數倍。
struct Demo{
char a;//sizeof(char)=1
int b;//sizeof(int)=4
flloat c;//sizeof(float)=4
double d;//sizeof(double)=8
};
struct Demo demo;
sizeof(demo)=24;
- 假設從0開始爲結構體變量分配內存
- 0:分配給demo.a;
- 4-7:分配給demo.b,根據原則一,分配起始地址必須爲成員變量內存長度的整數倍,1不是4的整數倍,所以從4開始分配;
- 8-11:分配給demo.c;
- 16-23:分配給deom.d,根據原則一分配起始地址必須爲成員變量內存長度的整數倍,必須爲8的整數倍,12不是8的整數倍,必須從16開始,同時滿足原則二,成員變量佔內存最長爲8,24爲8的整數倍,所以該結構體分配內存24;
struct Demo{
char a[6];//sizeof(char)=1
double b;//sizeof(double)=8
int c;//sizeof(int)=4
};
struct Demo demo;
sizeof(demo)=24
- 假設從0開始爲結構體變量分配內存
- 05:分配給demo.a;
- 8-15:分配給demo.b(根據原則一);
- 16-19:分配給demo.c(根據原則一);
- 20-23:補全爲8的倍數(根據原則二)。
struct Demo{
char a[6];
}demo;
sizeof(demo)=6;
struct Demo{
char a[6];
struct Demo *next;
}demo;
sizeof(demo)=16;(64位計算機)
指針變量的功能是存儲變量的地址,所以在定義執政變量的時候會爲指針變量分配一定的內存(16位:2,,32位:4,64位:8),而且這個內存的大小與指向的變量的類型無關,並不是指向double類型就分配8,指向int類型爲4,而是即使指向的char類型,分配的也是8(64位),因爲指針變量裏面存儲的只是地址