c語言 結構體在記憶體中的存放形式

2022-08-23 14:15:13 字數 1002 閱讀 4298

第一篇部落格,請大家多多包涵!

使用sizeof()運算子計算結構體在記憶體中所占用的位元組數很明顯可以看到與實際宣告型別的位元組數不同。(sizeof() 是用來計算型別在記憶體中所佔位元組數的大小)

對於剛入門的同學肯定會很疑惑,結構體在記憶體中到底是怎樣存放的呢?

struct nameattribute((packed)); 如果是gcc編譯器可以使用attribute((packed)) 指令告訴編譯器取消位元組對齊,這條指令是gcc編譯器特有的。

用幾個小例子就可以發現結構體在記憶體中存放的規律:

struct test1_st

;int main()

; printf("%lu\n",sizeof(test1));

}

執行結果:

8
很明顯乙個int加乙個char型別佔的應該是5個位元組,在結構體中卻是8位元組。說明存在位元組對齊。

struct test2_st

;int main()

; printf("%lu\n",sizeof(test2));

}

執行結果:

8
這次我只是在結構體中多加了乙個char型別,可他們占用的還是8位元組。說明:連續的資料型別所佔位元組數如果加起來不大於對齊單位,則會放在一起讀取!我們可以把他們的順序調整一下。

struct test3_st

;int main()

; printf("%lu\n",sizeof(test3));

}

執行結果:

12
我們這次把char c 調到了頂部,char c 與 char c2 已經不是連續的了。這時檢視執行結果為 12 ,證明了上述理論。

關於陣列在記憶體中的存放形式

char a 3 3 sizeof a 結果是9 9這個結果一直認為是 理所當然 但是當自己實現乙個二維陣列時,最簡單的方式就是 char test char malloc sizeof char row size int i 0 for ichar malloc sizeof char col s...

c語言 位域在記憶體中的存放

位域在實際開發中可能用的比較少,但是對於理解記憶體儲存資料非常有幫助!我們可以在結構體或共用體中描述乙個簡單的位域 struct st 首先我們先說說這個結構體在記憶體中所佔的大小 st變數占用了1個位元組,但只有3位 bit 用來儲存資料。當然如果用的是int型別,將會占用4個位元組,這是位元組對...

結構體在記憶體中對齊

剛剛完成乙個檔案的遷移程式,其中遇到了結構體對齊的問題,所以拿出來說說,與各位博友們分享。我的程式很簡單,就是把之前通過乙個結構體 fwrite 到檔案 a 裡的內容讀出,然後轉給另乙個結構體儲存。程式是簡單,但我擔心的是之前把結構體 fwrite 到檔案 a 的程式對齊結構體規則是怎樣的?一定要知...