解析C語言結構體,位段

2021-08-03 18:28:03 字數 1313 閱讀 1697

1.結構體的定義

將不同型別的資料組合成乙個有機的整體,這些整合在乙個整體中的資料是互相聯絡的,它們組織成乙個組合項,在乙個組合項中包含若干個型別不同(也可以相同)的資料項,c語言 中允許使用者自己指定這樣一種資料型別,它稱為結構體。

2.結構的初始化

結構的初始化與陣列的初始化很相似。乙個位於一對花括號內部、由逗號分隔的初始值列表可用於結構各個成員的初始化。這些值根據結構成員列表的順序寫出。如果初始列表的值不夠,剩餘的結構成員將使用預設值進行初始化。例:

3.結構體的typedef

使用關鍵字typedef可以對結構體型別宣告乙個新的名字,例:

4.結構體的記憶體儲存

下面來解釋為何是24,首先來了解記憶體對齊規則:

(1)結構的第乙個成員永遠都放在0偏移處;

(2)從第二個成員開始,都要對齊到對齊數的整數倍處;

對其數:結構成員自身大小和編譯器預設對齊數的較小值;

預設對齊數:vs-8,linux-4;

(3)結構體的總大小必須是最大對齊數的整數倍;

(4)如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數的整數倍

存在記憶體對齊的原因:

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

(2)效能原因:資料結構(尤其是棧)應該盡可能地在自認邊界上對齊。原因在於:為了訪問未對齊的記憶體,處理器需要做兩次記憶體訪問,而對齊的記憶體訪問僅需要一次訪問。

5.位段

位段成員必須宣告為int,signed int或unsigned int,在成員名的後面是乙個冒號和乙個整數,這個整數指定該位段所占用的位的個數。例:

儲存方式為:第二個位段無法放在第乙個位段剩餘的位上時,編譯器會把第二個位段放在記憶體的下乙個位元組上,在vc 中位段儲存單元的大小是4位元組。位段不能跨平台使用。

解析C語言結構體,位段。

1.結構的定義 聚合資料型別能夠同時儲存超過乙個的單獨資料。c語言提供了兩種型別的聚合資料型別,陣列與結構。陣列是相同型別元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。結構也是一些值的集合,這些值成為它的成員,但乙個結構的各個成員可能具有不同的型別。每個結構成員都有自己的名字,它們是...

C語言結構體,位段

1.結構的定義 在實際情況中,資料經常以成組的形式存在。如果這些值的型別各不相同,他們無法同時儲存於同乙個陣列中,在c中,可以使用結構把不同型別的值儲存在一起,所以結構也是一些值的集合,這些值稱為它的成員,但是這些成員的型別可以不同。拓展 結構 是一種構造資料型別,也叫做使用者自定義資料型別,它是由...

結構體 位段

在前面各章中,我們已經討論過位元組概念了。在大多數的計算機系統中,乙個位元組是由八個更小的,稱作為位的單位組成的。位是比位元組更小的單位。位只有兩個值,1 或 0 因此,儲存在計算機儲存器中的乙個位元組可以看成由八個二進位制數字形成的串。例如,乙個存放值 36 的位元組是八個二進位制數字的串 可以表...