1. 程式人生 > >C語言結構體在內存中的存儲情況探究------內存對齊

C語言結構體在內存中的存儲情況探究------內存對齊

.com ret size \n str 技術 urn 存儲 typedef


條件(先看一下各個基本類型都占幾個字節):

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語言結構體在內存中的存儲情況探究------內存對齊