1.結構體的定義
有以下3種方法定義結構體型別變數。
(1)先宣告結構體型別再定義變數
(2)在宣告型別的同時定義變數
例如:
struct student
student1,student2;
(3)直接定義結構體型別變數
struct
變數名錶;
2.結構體初始化
例如:
struct student
student1=;
3.結構體的typedef
typedef struct student
student;
typedef為這個新的結構起了乙個名字,叫node
4.結構體的記憶體儲存(記憶體對齊規則,為什麼存在記憶體對齊?)
記憶體對其規則:
(1)結構的第乙個成員永遠放在0偏移處;
(2)從第二個成員開始都要對齊到某個對齊數的整數倍處
其中,對齊數為結構成員自身大小和預設對齊數的較小值,預設對齊數:vs---8, linux---4
(3)結構體自身的總大小必須是最大對齊數的整數倍。
對齊原因:
(1)平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
(2)效能原因:資料結構
(尤其是棧)應盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問,然後拼湊出資料,而對齊的記憶體訪問一次,就可以得到資料。
乙個空結構體的大小為1,不是0的原因是:當你定義多個結構體變數時,由於佔0個位元組,所有他們的起始位址很可能相同,這是不允許出現的,為了避免浪費所以空結構體的大小為乙個位元組相對合適。
5.位段
(1)乙個位域必須儲存在同乙個位元組中,不能跨兩個位元組
。如乙個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。
struct s
;int main()
(2)由於位域不允許跨兩個位元組,因此
位域的長度不能大於乙個位元組的長度
。(3)位域可以無位網域名稱
,這時它只用來作填充或調整位置。無名的位域是不能使用的。
(4)位段的儲存和
位段的總大小
跟平台有關係,位段不存在記憶體對齊。
(5)位段是不跨平台的,是由於儲存方式導致。
C語言 結構體與位段(四) 關於位段
關於位段的基本形式 struct s 那麼,大家可以感覺到他和結構體唯一的不同點 好像就是冒號和後面的數字 那麼這是什麼意思呢?我們來求一下這個結構體的大小 詳情見第三章 記憶體對齊現象 struct s 是不是4 4 16 個位元組啊?是對的結構體這麼表示是16個位元組 但是當表示位段,不同點是,...
c語言結構體例項使用 位段結構體
一 位段結構體介紹 位段結構體就是按位讀寫,c語言提供了專門的結構體方式 二 位段結構體定義 struct struct status 三 位段結構體訪問 status.widthvalidated 0 printf d status.widthvalidated 四 工程例項 需求 當前有個32位...
C語言結構體中的位段
c語言結構體中的位段 位段的記憶體分配 位段的成員可以是 int unsigned int signed int 或者是 char 屬於整形家族 型別 位段的空間上是按照需要以4個位元組 int 或者1個位元組 char 的方式來開闢的。位段涉及很多不確定因素,位段是不跨平台的,注重可移植的程式應該...