C語言結構體與位段

2021-08-03 14:29:43 字數 1355 閱讀 7468

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 的方式來開闢的。位段涉及很多不確定因素,位段是不跨平台的,注重可移植的程式應該...