空結構體:對於空結構體,就是只有結構體這個模子,但裡面卻沒有元素的結構體。
例:typedef struct student
std;
這種空結構體的模子佔乙個位元組,sizeof(std)=1。
柔性陣列:
結構體中最後乙個元素可以是乙個大小未知的陣列,稱作柔性陣列成員,規定柔性陣列前面至少有乙個元素.
typedef struct student
std;
sizeof(std)=4;
sizeof求取該結構體大小是不包含柔性陣列的大小,柔性陣列不管有沒有大小都不計入結構體的大小,可以通過動態記憶體為它實現記憶體分配。
記憶體對齊:
對於字(自然邊界是偶數字址),雙字(自然邊界是能被4整除的位址),四字(自然邊界是能被8整除的位址)本身就是對齊的。為什麼要對齊呢?這是因為對於對齊的記憶體只需要一次記憶體訪問,對於未對齊的記憶體,處理器要兩次記憶體訪問。
未對齊:乙個字或者雙字跨越了4位元組邊界,或者雙字跨越了8位元組邊界,需要兩次記憶體訪問。
對於結構體,聯合體在計算其大小時要考慮其記憶體對齊,以結構中所佔位元組數最大的型別型別對齊。 例:
struct test ;
因為其中int型別所佔位元組最多,所以以4位元組對齊,記憶體分配方式如下,總共佔12個位元組:
分析:因為以4位元組對齊,首先char a1佔乙個位元組存到00處,short b2 是字
佔兩個位元組
,以偶數字址對齊,所以不能直接存到
01 02 上,而應該存到02 03上,而空出來的01就會被浪費掉。同理,當char c3存到04上後,對於int i,
雙字必須要存到4的倍數的位址上,
就只能存到08 09 0a 0b上,空出來的05 06 07會被浪費掉。
struct test ;
同樣的,以4位元組對齊,總共佔8個位元組:
這是因為a1存到00,c3存到01,b2剛好存到02 03上,以偶數字址對齊,d4也剛好從04開始儲存,以4位元組對齊,沒有浪費記憶體。
大端位元組序:高位元組儲存在低位址,低位元組儲存在高位元組處
小端位元組序:低位元組儲存在低位址,高位元組儲存在高位址處
計算機的最小儲存單位是位元組,乙個位元組佔8bit位。
以int為例:
例如:1的二進位製碼是
00000000 00000000 00000000 00000001
寫成十六進製制形式 :00 00 00 01這就代表了4個位元組,而記憶體是從低位址到高位址的,這樣就產生了兩種儲存方式。
因為儲存方式方式的不同,讀取時也就產生了兩種方式。
一般讀取是從低位址向高位址讀取,為了將儲存與讀取統一取來,所以採用小端儲存,這樣的話,低位元組存到低位址,高位元組存到高位址。
驗證方法:
1、可以宣告乙個int a=1,再宣告乙個char *p=&a;因為a佔4個位元組,char *一次向後訪問乙個位元組,所以如果是小端的話在電腦上輸出*p應該是1.
2、也可以用union,因為union是記憶體公用,所以宣告乙個int a,char c;對a賦值為1,輸出c觀察結果。
有些問題如果不考慮大小端的話是根本想不明白的。
大端位元組序 小端位元組序
大端位元組序 大端儲存模式是指資料的低位元組內容儲存到記憶體的高位址中,而資料的高位元組內容儲存到記憶體的低位址中 小端位元組序 小端儲存模式是指資料的低位元組內容儲存到記憶體的低位址中,而資料的高位元組內容儲存到記憶體的高位址中 程式驗證 include int main return 0 程式改...
大端位元組序 小端位元組序(網路位元組序 主機位元組序)
大端位元組序 整數的高位位元組儲存在記憶體的低位址處,低位元組儲存在記憶體的高位址處。一般pc大多採用小端位元組序,也稱為主機位元組序。網路上傳輸採用大端位元組序,也稱為網路位元組序。linux中常用轉換函式如下 include uint32 t htonl uint32 t hostlong 無符...
小端位元組序與大端位元組序
端模式分為 小端位元組序和大端位元組序,也就是位元組在記憶體中的順序。小端位元組序 低位元組存於記憶體低位址 高位元組存於記憶體高位址。如乙個long型資料0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x...