C語言結構體的記憶體分配

2022-10-11 02:57:14 字數 1099 閱讀 6734

原則一:結構體中元素按照定義順序存放到記憶體中,但並不是緊密排列。從結構體儲存的首位址開始 ,每乙個元素存入記憶體中時,它都會認為記憶體是以自己的寬度來劃分空間的,因此元素存放的位置一定會在自己大小的整數倍上開始。

原則二: 在原則一的基礎上,檢查計算出的儲存單元是否為所有元素中最寬的元素長度的整數倍。若是,則結束;否則,將其補齊為它的整數倍。

注意:如果有充分的理由決定不對結構的成員進行重排,以減少因對齊帶來的空間損失。列如,為了提高程式的可維護性和可讀性,將相關的結構成員儲存在一起。應該根據結構成員的邊界需要進行重排,減少因邊界對齊而造成的記憶體損失。

sizeof操作能夠得出乙個結構的整體長度,包括因邊界對齊而跳過的那些位元組。

offsetof能查詢指定成員的實際位置

offsetof(type, member);

// type 結構體型別

// member 結構體成員

#include #include int main(int argc, char *ar**) ;

struct struct_test2 ;

printf("the length of structure test1 is: %ld \r\n", sizeof(struct struct_test1) );

printf("location of parameter b: %ld \r\n", offsetof(struct struct_test1, c) );

printf("the length of structure test1 is: %ld \r\n", sizeof(struct struct_test2) );

printf("location of parameter b: %ld \r\n", offsetof(struct struct_test2, c) );

return 0;

}

執行結果:

從執行結果可以得出 結構成員排序會影響記憶體的大小。

C語言好難 結構體的記憶體分配

結構體的記憶體分配,我個人是覺得比較蛋疼的,它有乙個需要遵循的原則,位址對齊,也有人稱為記憶體對齊,叫法沒關係,反正我只是 拿來 會用就行。好了,先有這麼乙個概念,什麼是記憶體對齊,先丟一邊。o o 滾來滾去 o o 設char占用1個位元組,int占用4個位元組。那麼問題1 struct a ch...

c 結構體,既記憶體分配

說明結構變數有以下三種方法。以上面定義的stu為例來加以說明。1 先定義結構,再說明結構變數。如 struct stu struct stu boy1,boy2 說明了兩個變數boy1和boy2為stu結構型別。也可以用巨集定義使乙個符號常量來表示乙個結構型別。例如 define stu struc...

結構體的記憶體分配

記憶體大小和系統有關,如32位系統和64位系統,同一資料型別,記憶體分配大小不一 假設這台機器是sizeof char 1 sizeof int 4 sizeof double 8 列舉型別只為最寬的資料分配記憶體,在不同的時候,用的是同一塊記憶體 在預設情況下,規定各成員變數的起始位址相對於結構的...