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

2021-08-25 11:56:32 字數 1228 閱讀 8363

首先需要明白結構體內存對齊的好處:提高訪問效率。但是會造成一定的空間浪費。

c語言結構體服從以下原則:

1.記憶體對齊

1.結構體大小必須是結構體占用最大位元組數成員的整數倍,這樣在處理陣列時可以保證每一項都邊界對齊

2.結構體的每乙個成員起始位址必須是自身型別大小的整數倍

3.位元組對齊取決於編譯器,keil預設4位元組

typedef struct

store_info;

store_info storeinfo;

typedef struct

store_info;

store_info storeinfo;

typedef struct

store_info;

store_info storeinfo;

可見同樣的三個成員,定義順序不一樣,結構體占用位元組數就不一樣,但是始終滿足:

結構體大小必須是結構體占用最大位元組數成員的整數倍

但是為什麼成員的順序不同,結構體占用位元組數也不同呢?

還是位元組對齊的問題

typedef struct

store_info;

對於這個結構體

keil預設按4位元組對齊,但實際上由於結構體中單個成員的最大占用位元組數為2位元組,因此實際還是按2位元組對齊

所以假設a的位址是0,由於結構體的每乙個成員起始位址必須是自身型別大小的整數倍

所以b的起始位址不可能是1,那麼b的位址就是2~3,c就是4

但是加起來是5個位元組,但是不滿足結構體大小必須是結構體占用最大位元組數成員的整數倍

所以需要補1個位元組,總共占用6個位元組!

1.

struct name

;//問題: 求sizeof(name)= ?

//答案: 12

struct name1

;//問題: 求sizeof(name1)= ?

//答案: 8

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

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.執行結果顯示 那麼。為什麼會出現這種...

C語言之struct結構體內存分配

實驗使用sizeof關鍵字測量結構體大小的規則 查資料得到的規則如下 原則1 資料成員對齊規則 結構 struct或聯合union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為4位元組,則要從4的整數倍位址開始...

C語言結構體內存對齊問題

1.64位系統,long double在struct結構體中對齊值是8,int float對齊值是4,char對齊值是1,short對齊值2 sizeof long sizeof double 8 2.32位系統,long在struct結構體中對齊值是4,double在struct結構體中對齊值是4...