結構體詳解

2021-08-19 03:03:56 字數 1288 閱讀 4658

結構體宣告

struct tag //結構體名稱可以省略,但建議不要省略

s,*p/*可以在宣告的同時定義變數*/;

舉個例子

struct

x;struct

*p,s;

注意:這裡是匿名結構體,編譯器把二者看作完全不同的型別

結構體訪問

結構體訪問操作符:點操作符(.)、(->)操作符。

struct stu

*p,s;

/*成員訪問*/

s.name = "李四";

s.age = 20

;/*指標訪問*/

(*p).name = "張三";

(*p).age = 18

;

結構體自引用

結構體自引用要通過指標引用。

/*正確引用*/

struct s

/*錯誤引用*/

struct s

結構體內存對齊

先了解乙個概念:對齊數

對齊數 = 編譯器預設的對齊數於該成員中的最小值。vs 預設值 4,linux 預設值 為8.

記憶體對齊的4個原則:

第乙個成員在結構體偏移量為0的位址處

其他成員要對齊到偏移量為對齊數整數倍的位址處。

結構體的大小為最大對齊數的整數倍。

巢狀的結構體要對齊到結構體最大對齊數的整數倍。

可以通過#pragma pack(num) 更改預設對齊數(num = 1,2,4,8,16任意乙個),當更改的大於編譯器預設的時候,預設對齊數不改變。

結構體實現位段

舉個例子

/*位段*/

struct a

位段成員必須是 int 、unsigned int 、signed int 、char.

位段分配記憶體空間如下:

位段空間開闢:是以4個位元組(int)、1個位元組(char)開闢的。

位段的跨平台問題:

成員在記憶體中從左往右分配、還是從右往左分配標準未定義。

第二個位段成員,無法容納上乙個位段剩餘的位置時,是捨棄剩餘位還是利用,是不確定的。

位段記憶體對齊:

結構體位段,資料成員型別相同,第乙個成員已對齊,所以其餘也對齊了。

結構體 詳解

1 c語言基本型別 字元型,整型,浮點型 2 結構體 複雜型別 自定義型別 i 3 定義變數 為了分配空間 型別 變數名 注 分配空間編譯器通過型別來分配 初始化 定義變數同時賦值 3.1定義結構體 自定義 的型別 struct 型別名 3.1.1無巢狀結構體 所有屬性都是基本型別 定義人的型別 人...

結構體對齊詳解

include struct a int main struct b 現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 那麼上面兩個結構大小如何呢?結果...

Linux Struct file 結構體詳解

二 struct path f path 被定義在linux include linux namei.h中,其原型為 struct path 在早些版本的核心中並沒有此結構,而是直接將path的兩個資料成員作為struct file的資料成員,struct vfsmount mnt的作用是指出該檔案...