C語言結構體大小計算

2021-10-25 06:55:45 字數 973 閱讀 8281

定義

結構體中的偏移量

結構體中的偏移量是乙個成員的實際位址和結構體首位址之間的距離。

結構體大小計算

結構體大小 會涉及到位元組對齊(目的是 讓計算機快速讀寫 以空間換取時間)。即,最後乙個成員的偏移量加上最後乙個成員的大小再加上末尾的填充位元組數。

結構體內偏移規則

1、每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍如果不是編譯器會在成員之間加上填充位元組。

2、當所有成員大小計算完畢後,編譯器判斷當前結構體大小是否是結構體中最寬的成員變數大小的整數倍 如果不是會在最後乙個成員後做位元組填充。

struct unknown ;

printf("%lu\n", sizeof(struct unknown));

//output : 32123456789

結構體重共有乙個long型別,兩個char型別,兩個int型別成員。如果只按照這幾個成員大小相加,結構體大小應該是 8 + 2 * 4 + 2 * 1 = 18 個位元組大小。但實際上該結構體是32個位元組大小。

下面來一步步分析編譯器是如何計算大小進行分配的。(以下未標明單位的數字以位元組為單位)

1、遇到第乙個成員變數a,該成員偏移量為0,大小為4,符合偏移規則第一條。

2、接下來第二個成員變數b,偏移量為4,大小為1,符合偏移規則第一條。

3、成員變數c,偏移量為5,大小為4,不符合偏移規則第一條。在成員b和c之間填充三個位元組,此時,偏移量大小為8,符合偏移規則第一條,繼續往下。

4、成員變數d,偏移量為12,大小為8,不符合偏移規則第一條,在成員c和d之間填充4個位元組,此時偏移量為16,符合偏移規則第一條,繼續往下。

5、成員變數e,偏移量為24,大小為1,符合偏移規則第一條。

6、所有成員大小計算完後,執行偏移規則第二條,最寬的型別是d,long型別,8個位元組,當前結構體計算出的大小為25,並不符合第二條規則,於是在末尾填充7個位元組,總大小為32個位元組,滿足第二條偏移規則。到此結構體大小計算結束。

C語言結構體大小計算

結構體中的偏移量是乙個成員的實際位址和結構體首位址之間的距離。結構體大小 會涉及到位元組對齊 目的是 讓計算機快速讀寫 以空間換取時間 即,最後乙個成員的偏移量加上最後乙個成員的大小再加上末尾的填充位元組數。1 每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍如果不是編譯器會在成員之間加上填充...

結構體大小計算

c語言 結構體大小計算 個人標籤啥東東封尾機 參考 一 結構體變數中成員的偏移量必須是成員大小的整數倍 0被認為是任何數的整數倍 eg typedef struct stu4 stu4 typedef struct stu5 stu4 這兩個結構體大小都為8 已驗證 二 結構體大小必須是所有成員大小...

結構體大小計算

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 先介紹乙個相關的概念 偏移量。偏移量指的是結構體變數中成員的位...