C語言結構體對齊的問題

2021-10-01 11:14:07 字數 504 閱讀 5580

做《作業系統》助教,給學生們提供乙個實驗的標頭檔案時忽略了乙個細節。

typedef

struct dir_item dir_item;

我給的注釋是128位元組,但這個大小是我口算的。乙個學生發現了問題:這個結構體實際上佔了132位元組。這是因為結構體會自動按結構體裡最大的元素去對齊,這裡是32位。所以bytes浪費3個位元組,item_count加兩個char正好32位,但name剩下的119個char要占用30個32位,因此也浪費乙個位元組,共四個位元組。

因此在我的**裡實際上是有風險的,而之前之所以沒有出錯是因為沒有測試極端情況。如果name特別長達到120位元組就會出錯了,這個name就永遠不會被找到。

但是改起來也好改,只需要調整一下順序即可。

typedef

struct dir_item dir_item;

這提醒我萬事還需小心、謹慎,假如我謹慎一點用sizeof看一下結構體大小就不會出這種問題了。

C語言結構體對齊問題

結構體對齊規則 預設對齊方式,按結構體的成員中 size 最大的成員對齊。拋開成員size來說,一般情況下32位機器預設4位元組對齊,64位機器預設8位元組對齊。另外可以使用偽指令 pragma pack n 修改預設的位元組對齊。1.使用偽指令 pragma pack n 編譯器將按照 n 個位元...

C語言結構體對齊 記憶體對齊問題

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...

C語言結構體對齊問題詳解

c語言結構體對齊問題詳解 測試環境32位機 winxp 編譯器vc6 ms cl.exe 和 mingw32 gcc 4.5.2 1 結構體資料對齊 沒有 pragma pack 巨集定義 結構體對齊可以總結為三個基本原則 資料成員對齊規則 結構體的資料成員中,第乙個成員從offset為0的位址開始...