首先看一段程式,猜測輸出結果:
#include union a
;int main()
結果是 -859045622
而下面這段程式:
#include union a
;int main()
結果是266
為啥呢?
首先我們看這裡有個union聯合體,我們知道聯合體內的資料型別是共享記憶體的。
也就是說這個a 其實就占用四個位元組,上面兩個程式的唯一區別就在於a的宣告,乙個是自動的,乙個是static的,兩者的區別是static的變數存在於靜態儲存區,是初始化的,而乙個是在棧裡,沒有初始化。
第乙個程式中,沒有初始化,是隨機值,難怪會輸出這麼奇怪的數字。。。
第二個程式,聯合體的記憶體分布式這樣的。
static變數初始化為0
第乙個位元組 第二個位元組 第三個位元組 第四個位元組
0000,0000 0000,0000 0000,0001 0000,0010
c[1] c[0]
這樣就成了256 + 10 = 266
測試一下我的cpu是不是小段模式
#include bool isbigendian()
return false;
}int main()
else
return 0;
}
C struct記憶體對齊 union的大端小端
系統禁止編譯器在乙個結構的起始位置跳過幾個位元組來滿足邊界對齊要求,因此所有結構的起始儲存位置必須是結構中邊界要求最嚴格的資料型別所要求的位置。如某個機器的整型長度為4個位元組且它的起始儲存位置能夠被4整除,那麼結構體 struct allgn 在記憶體中的儲存的起始位置必須是乙個能夠被4整除的位址...
小端模式和大端模式 大端模式和小端模式
0x123456在記憶體中的儲存方式 大端模式 低位址 小端模式 低位址 不難看出大端模式比較符合人的直觀認識 1.一開始是由於不同架構的cpu處理多個位元組資料的順序不一樣,比如x86的是小段模式,keil c51是大端模式。但是後來網際網路流行,tcp ip協議規定為大端模式,為了跨平台通訊,還...
struct和union的記憶體分配
struct struct結構體在分配記憶體時需要遵循記憶體對齊規則 1.結構體的起始儲存位置必須是能夠被該結構體中最大的資料型別所整除 2.前面單元的大小必須是後面單元大小的整數倍 每個資料成員儲存的起始位址必須是自身大小的整數倍 如果不夠就補齊 3.整個結構體的大小 即sizeof的結果 必須是...