typedef struct strdent1
std1; //4+1+3=8
typedef struct strdent2
std2; //3+4+1=8
printf("%d \n",sizeof(std1));
printf("%d\n",sizeof(std2));
按理來說兩個都應該為8.
執行結果顯示:
那麼。為什麼會出現這種狀況呢?
結構體內存分配時,每次申請一塊最大元素的空間,存放首元素,若剩餘空間可以放下下乙個元素,則不申請新空間,僅在其後存放下乙個元素。若餘下空間不足以繼續存放下乙個元素,則在後面申請新的空間(大小與最大元素相等),存放下來的元素。
對於std1:先開闢4個位元組,存放int後佔滿,再開闢4個位元組(同最大元素相等,在此為int),存放char a[3],發現餘下1位元組,恰好存放餘下來的char c.那麼,
對於std2:同樣開闢4個位元組(其最大成員為int),存放第乙個元素 char a[3],其後剩餘1個位元組,不足以存放第二個元素 int b,則再開闢4個位元組,存放第二個元素。再開闢第三個空間,用來存放 char c.
由此可以得出:
(1):結構體記憶體空間為最大成員的倍數。
(2):結構體中成員的順序同時決定結構體大小。
C語言結構體內存分配問題
首先需要明白結構體內存對齊的好處 提高訪問效率。但是會造成一定的空間浪費。c語言結構體服從以下原則 1.記憶體對齊 1.結構體大小必須是結構體占用最大位元組數成員的整數倍,這樣在處理陣列時可以保證每一項都邊界對齊 2.結構體的每乙個成員起始位址必須是自身型別大小的整數倍 3.位元組對齊取決於編譯器,...
C語言之struct結構體內存分配
實驗使用sizeof關鍵字測量結構體大小的規則 查資料得到的規則如下 原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為4位元組,則要從4的整數倍位址開始...
C語言中記憶體分配問題
推薦 c語言中記憶體分配 linux size命令和c程式的儲存空間布局 本大神感覺,上面的鏈結的內容,已經很好的說明了 對於乙個可執行檔案,在linux下可以使用 size命令列出目標檔案各部分佔的位元組數 分為 text段 data段與bss段 參考 linux size命令和c程式的儲存空間布...