C語言結構體對齊問題

2021-09-20 21:21:46 字數 800 閱讀 7406

結構體對齊規則

預設對齊方式,按結構體的成員中 size 最大的成員對齊。拋開成員size來說,一般情況下32位機器預設4位元組對齊,64位機器預設8位元組對齊。

另外可以使用偽指令#pragma pack (n)修改預設的位元組對齊。

1.使用偽指令#pragma pack (n),編譯器將按照 n 個位元組對齊。

2.使用偽指令#pragma pack (),取消自定義位元組對齊方式。

3.如果#pragma pack (n)中指定的 n 大於結構體中最大成員的 size,則其不起作用,結構體仍然按照 size 最大的成員進行對齊。

結構體對齊例子

#includeint main()

; struct test2;

#pragma pack (8)

struct test3;

#pragma pack ()

struct test x;

struct test2 y;

struct test3 z;

printf("sizeof(x):%ld \n",sizeof(x));

printf("sizeof(z):%ld \n",sizeof(y));

printf("sizeof(z):%ld \n",sizeof(z));

}

執行結果:

sizeof(x):3 

sizeof(z):12

sizeof(z):12

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

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

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

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

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

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