C語言中結構體內存分配問題

2021-09-19 07:43:20 字數 970 閱讀 8273

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程式的儲存空間布...