C語言 結構體

2021-10-10 22:15:36 字數 1658 閱讀 4713

結構體是由一批資料組合而成的一種新的自定義型別。

內建型別不能表示所有的場景,比如:學生群體;描述學生:name、age、gender、height。

struct student

;

(1)為什麼需要記憶體對齊?

1、平台原因(移植原因):

不是所有的硬體平台都能訪問任意位址上的任意資料;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2、效能原因:

資料結構(尤其是棧)應該盡可能地在自然邊界上對齊;

原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,而對齊的記憶體訪問僅需要一次。

(2)如何進行記憶體對齊?

這裡分為兩大步驟:

1、使結構體中每個成員變數都處在對齊的位址上:

a、結構體中的第乙個成員變數在偏移量為0的位址上;

b、剩餘的變數,對齊規則:min(該變數型別,預設對齊數),然後檢測該變數相對於結構體起始位置的偏移量是不是該min的整數倍。不是的話,需要在該變數之前補齊位元組數。

2、讓結構體整體對齊:

使得結構體大小為 min(結構體成員變數型別最大者,預設對齊數)的最小整數倍。

(3)求結構體中某個成員變數相對於結構體起始位置的偏移量?

offsetof(結構體型別, 成員名字)

模擬實現該巨集:

#define offsetof(s, m) (size_t)&(((s*)0)->m)

//讓編譯器將0號位址單元開始的一塊記憶體作為s的結構體進行解析。

位段為一種資料結構,可以把資料以位的形式緊湊的儲存,並允許程式設計師對此結構的位進行操作。

位段的好處:

跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間。

位段的缺點:

位段的記憶體分配與對齊的實現方式依賴於具體的機器和系統,在不同的平台可能有不同的結果,這導致了位段在本質上是不可移植的。

位段記憶體對齊:

a、前後型別相同,位元位能共用則共用,否則重新開闢對應型別的空間;

b、前後型別不一致,重新開闢空間。

聯合體也是一種特殊的自定義型別,這種型別定義的變數也包含一系列的成員,特徵是這些成員共用同一塊記憶體空間。

聯合的特點:

聯合的成員共用同一塊空間,這樣乙個聯合變數的大小,至少是最大成員的大小。

聯合大小的計算:

為什麼有大小端?

因為在計算機系統中,我們是以位元組為單位的,每個地質單元都對應著乙個位元組,乙個位元組位8bit,但是在c語言中除了8bit的char之外,還有16bit的short、32bit的long(具體看編譯器),對於位數大於8位的處理器,由於暫存器大於乙個位元組,那麼必然存在乙個如何將多個位元組安排的問題,因此就導致了大端儲存模式和小端儲存模式。

大小端跟作業系統是否有關係?

跟作業系統沒有關係,cpu是大小端儲存的決定因素。

如何測試乙個機器為大端還是小端?

//利用聯合體判斷

intcheck_sys()

un; un.i =1;

return un.c;

}int

main()

else

system

("pause\n");

return0;

}

C語言結構體

1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...

C語言 結構體

宣告乙個結構體型別 struct 結構體名 成員表列 定義結構體變數的方法 1 先宣告結構體型別再定義變數名。在定義了結構體變數後,系統會為之分配記憶體單元.例如 struct student student1,student2 2 在宣告型別的同時定義變數,例如 struct 結構體名 成員表列 ...

c語言 結構體

1 定義結構體 c語言允許使用者自己建立不同型別資料組成的組合型的資料結構 struct 結構體名 1 結構體的型別不是只有一種,可以根據需要設計許多種,如struct student struct worker等 2 結構體的成員可以是另一結構體的成員,注意的是引用此成員的方式 2 定義結構體變數...