結構體變量內存分配問題

遵守兩個原則

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;
  1. 假設從0開始爲結構體變量分配內存
  2. 0:分配給demo.a;
  3. 4-7:分配給demo.b,根據原則一,分配起始地址必須爲成員變量內存長度的整數倍,1不是4的整數倍,所以從4開始分配;
  4. 8-11:分配給demo.c;
  5. 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
  1. 假設從0開始爲結構體變量分配內存
  2. 05:分配給demo.a;
  3. 8-15:分配給demo.b(根據原則一);
  4. 16-19:分配給demo.c(根據原則一);
  5. 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位),因爲指針變量裏面存儲的只是地址

大家把上面幾個例子分析清楚,應該對結構體內存分配了解的就差不多了,如有錯誤希望大家指正。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章