1、結構體空洞
結構欄位在儲存器中並不一定是挨著擺放的,有時兩個字段之間會有小的空隙。
因為計算機總希望資料能對齊字邊界,如果計算機的字長是32位,就不希望某個變數跨越32位的邊界儲存。
因為計算機按字從儲存器中讀取資料,如果某個字段跨越了多個字,cpu就必須讀取多個儲存單元,並以某種方式把督導的值合併起來。會很慢。
2、匿名結構
匿名結構就是沒有名字的結構,
typedef
struct spider_man;
有乙個叫spider_man的別名,但沒有結構名,很多時候,如果建立了別名,也就不需要結構名了。
3、指定初始化器
可以用「指定初始化器」按名設定結構和聯合字段,屬於c99標準。絕大多數現代編譯器都支援「指定初始化器」,但如果c語言的變種,可能不支援(比如:c++不支援)
typedef truct
bike;
bike b = ;
4、結構體初始化
margarita m = }; //成功編譯
margaruta m;
m = }; //不能編譯,因為只有把}和結構宣告寫在一行裡,編譯器才知道它代表結構,否則,編譯器會認為是陣列。
5、列舉記錄聯合中儲存了什麼值
編譯器不會記錄你在聯合中設定或讀取過哪些字段。我們完全可以設定乙個字段,讀取另乙個字段,但有時這會造成很嚴重的後果。
可以通過建立列舉,記錄我們在聯合中儲存了什麼值。
#include
typedef
enum
unit_of_measure;
typedef
union
quantity;
typedef
struct
fruit_order;
void display(fruit_order order)
else
if (order.units == pounds)
else
}int main()
; fruit_order oj = ;
display(strawberries);
display(oj);
return
0;}
6、位欄位(bitfield)
如果編譯器發現結構中只有乙個位欄位,還是會把它填充成乙個字,多個位欄位總是結合在一起。
位欄位不僅僅是為了節省空間,如果要讀取底層的二進位制資訊,位字段會非常有用。比如讀寫某類自定義二進位制檔案。
位欄位應該宣告成unsigned int。
結構 聯合 位欄位 列舉
結構體在宣告的時候並沒有分配任何的記憶體資源,只有定義了結構體變數才會產生相應的記憶體分配。define僅僅是做簡單的替換,而typedef是給某種資料型別建立乙個替代名。看這樣的例子 include define charp char int main 編譯 gcc typedef.c typed...
結構體內存對齊,位段,列舉 聯合
結構體內存對齊規則 1.第乙個成員在與結構體變數偏移量為0的位址處2.其他成員變數要對齊到對齊數的整數倍的位址處。對齊數 編譯器預設的乙個對齊數與該成員大小的 較小值vs中預設的值為8,linux中的預設值為43.結構體總大小為最大對齊數 每乙個成員變數都有乙個對齊數 的整數倍4.如果巢狀了結構體的...
位段,列舉,聯合
前面我們說過了自定義型別,包含結構體,位段,列舉,聯合。前一篇我們總結了結構體,今天來說一下位段,列舉,聯合。一 位段 1 位段概念 c語言中允許在乙個結構體中以位為單位來指定其成員所佔記憶體長度,這種以位為單元的成員稱為 位段 或 位域 1 位段的成員可以是int,unsigned int,sig...