C語言結構體在內存中的存儲情況探究------內存對齊
條件(先看一下各個基本類型都占幾個字節):
void size_(){ printf("char類型:%d\n", sizeof(char)); printf("int類型:%d\n", sizeof(int)); printf("float類型:%d\n", sizeof(float)); printf("double類型:%d\n", sizeof(double)); return; }
結果:
先來一下, 這個結構體在內存中占有多少個字節的內存呢?
typedef struct mystruct{ /*結構1*/int i_int; char c_char; char s_char[9]; }MYSTRUCT;
這個呢(交換數據成員順序)?
typedef struct mystruct{ /*結構體2*/ char c_char; int i_int; char s_char[9]; }MYSTRUCT;
現在讓它自己告訴我們
int main() { MYSTRUCT my_st = {0}; int size_struct = sizeof(my_st); printf("%d\n", (int)&my_st.i_int); printf("%d\n", (int)&my_st.c_char); printf("%d\n", (int)my_st.s_char); printf("占用內存大小:%d 個字節\n", size_struct); return 0; }
首先看結構體1的結果
可以看出:int占有4個字節, char占有了1個字節, 那麽後面char類型的數組占有了11個字節
這是什麽鬼?明明定義了char數組長度為9為什麽會是11
別著急繼續向下看
查看結構體2的結果(難道不是16?)
哈哈, 竟然又出來個20
揭曉答案:
這是因為結構體的存儲存在內存對齊機制,也就是 < 結構體大小能被最寬基本類型成員大小所整除 >
基本類型指的是 char int double 等,這樣的對齊機制使得尋址更加方便
為什麽結構體1占有16個字節:
因為單個char成員會與其下面的char類型數組組合在一起 也就是相當於一個char類型的長度為10的數組
其中最寬基本類型為 int 占4個字節 而後面的 ”char[10]“數組要滿足是int占有4個字節的整數倍最小的就是12, 所以共16個字節
為什麽結構體2占有20個字節:
第一個成員為char單個字符, 其後面是一個int類型,不能結合故要給char分配4個字節
後面的char數組當然還要分配12個字節, 所以4+4+12=20個字節
了解了對齊機制後再來分析一個
typedef struct mystruct{ /*結構體3*/ char c_char; double d_double; int i_int; char s_char[9]; }MYSTRUCT;
分析:
最寬基本類型是 double 占有8個字節----------------------------------------------------------------8
第一個char占有1個, 但是要補齊為8個字節---------------------------------------------------------8
後面的int占有4個,相當於4個char類型,與char數組結合為 ”char[4+9]“ , 要補齊為16個字節----16
得到結果-------------------------------------------------------------------------------------------32
驗證一下
果然就是這樣
本節完......
C語言結構體在內存中的存儲情況探究------內存對齊