C語言結構體對齊

2021-10-10 15:51:54 字數 781 閱讀 5527

今天又解碼乙個二進位制檔案,又遇到了問題,事情是這樣的:讀取乙個字段,我用乙個結構體來接收這些數,然後逐個處理,但結果卻不對。我用二進位制讀取軟體讀取這個檔案,與處理出來的結果對比發現:處理出來的資料竟然跳過乙個4位元組,也就是說,我處理出來的資料裡面沒有原始二進位制檔案中的對應的那4個位元組。

師兄又來了,print一下結構體的大小,發現是40個位元組,而我取的是36位元組。多出來的4位元組是**來的呢,這個時候師兄突然想到了結構體對齊這個東西。

struct c_table

;

逐個取,總共36位元組,按理是沒錯的啊,但是結構體有乙個對齊的東西需要注意。對齊的原因就是為了提高訪問的效率。

如果將結構體比喻成乙個長方形容器(容器的寬度為結構體中資料型別大小最大的值),我們往裡放資料(也是長方形):

對齊很關鍵,需要留意。

舉幾個例子結束:

struct aa

;

這個結構體的大小是12位元組。

struct aa

;

這個結構體的大小是8位元組。

c語言 結構體對齊

1 編譯器是按照什麼樣的原則進行對齊的?a.資料型別自身的對齊值 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。b.結構體或者類的自身對齊值 其成員中自身對齊值最大的那個值。c.指定對齊值 pragma pack ...

C語言結構體對齊

解析c語言結構體對齊 記憶體對齊問題 c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾...

c語言結構體對齊

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。結構體到底怎樣對齊?下面總結了對齊原則,在沒有 pragma pack巨集的情況下 原則1 普通資料成員對齊規則 第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 ...