C語言 結構體的大小

2021-10-01 13:18:37 字數 1706 閱讀 3250

為了計算結構體大小,需要知道各個基本資料型別的大小:

資料型別

char

short

intlong

float

double

指標大小12

4448

根據編譯器

指標在x86下為4個位元組,在x64下為8個位元組。

結構體大小計算的規則:

第乙個成員在與結構體變數偏移量為0的位址處

其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值,在vs環境下預設值為8,在linux環境下預設值為4。結構體的總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。如果巢狀了結構體的情況,被巢狀的結構體對齊到其自身對齊數的整數倍處(結構體的對齊數就是其內部成員中最大的對齊數),此時結構體的整體大小就是所有最大對齊數(含被巢狀結構體的對齊數)的整數倍。

通過乙個例子說明:

#include

intmain

(void)a;

printf

("%d\n"

,sizeof

(a))

;return0;

}

我一開始的思路:結構體中共有4個成員,4(int)+8(double)+3(char)+4(long) = 19,答案是19!!!

事實證明,這個答案是錯誤的。

我沒有考慮到偏移量這個概念。看一下每個成員的偏移量:成員a

bcd偏移量04

1215

在計算偏移量時,需要明確對齊數的概念。對齊數 = 編譯器預設的乙個對齊數與該成員大小的較小值,我在vs下編譯,所以預設對齊數字8,成員d是long型,大小為4位元組,因此d的對齊數為4,偏移量應當為4的倍數,後移1bit正好是16,16是4的整數倍,因此d的偏移量應為16。成員a

bcd偏移量04

1216

好了,d後移了一位,所以結構體大小是20!!!

事實證明,又錯了。

我沒有考慮到結構體大小應是最大對齊數的整數倍。成員a

bcd對齊數–8

14注意:這裡c雖然是乙個char型陣列,但計算對齊數時還是按照char來計算的。

這個結構體的最大對齊數為8,20不是8的整數倍,後移,24是8的整數倍,因此這個結構體的大小應該是24!!!

執行一下:

正確!!!

再試乙個例子:

#include

intmain

(void)a;

printf

("%d\n"

,sizeof

(a))

;return0;

}

按照上述規則,先求各成員的對齊數:成員a

bcd對齊數–4

14然後考慮成員的偏移量:成員a

bcd偏移量04

816這個結構體的最大對齊數為4,20正好是4的整數倍,因此這個結構體的大小為20。

參考:

結構體大小 C語言

記憶體對齊 各種資料存放的位址要能夠整除該資料本身的位元組數 char可存放在任意位址,short存放在能被2整除的位址,int存放在能被4整除的位址 1 先將每個成員的位元組數寫出,然後從第二個成員開始,將前面成員的總位元組數補齊成當前位元組數的倍數 2 結構體的總大小,一定要能整除單個成員最大型...

C語言 計算結構體大小

結構體中的成員可以是不同的資料型別,成員按照定義時間的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對其問題。結構體對齊規則 通入下面例題,計算結構體大小 題1 struct s1 題2 struct s2 題3 st...

C語言中的結構體大小

現代計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任意型別的變數。但實際中在訪問特定型別變數時經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序乙個接乙個地存放,這就是對齊。不同硬體平台對儲存空間的處理上存在很大的不同。某些平台對特定型別的資料只...