從乙個成員得到結構體的位址

2021-04-20 14:22:07 字數 820 閱讀 6864

container_of巨集

#define offset_of(type, member) ((size_t) &((type *)0)->member)

type  // 結構名

member // type 結構中的成員

(type *)0 // 告訴編譯器有乙個指向 type 結構的指標,其值為止0

((type *)0)->member // 取結構 type 中的 member 成員

&((type *)0)->member // 取結構 type 中的 member 成員的位址

因為基位址為0,所以這時 member 成員的位址就是 member 在 type 中的偏移

最後再把結果強制轉換為size_t型   

作用: 返回結構 type 中的成員 member 的偏移位址

offsetof巨集定義在[include/linux/stddef.h]中

#define container_of(ptr, type, member) ()

container_of巨集定義在[include/linux/kernel.h]中

typeof() 是 gcc 的擴充套件,和 sizeof() 類似 ,以獲得 member 成員的資料型別

這裡使用的是乙個利用編譯器技術的小技巧,即先求得結構成員在與結構中的偏移量,然後根據成員變數的位址反過來得出屬主結構變數的位址。

typeof( ((type *)0)->member ) // 獲得 member 成員的資料型別

const typeof( ((type *)0)->member ) *__mptr // 宣告乙個const 指標

C語言根據結構體成員變數的位址,得到結構體的位址

看nginx 時發現雙鏈表使用的是這種方法,記錄一下 給出乙個例項來說明 struct father t f char ptr f.b 而不是 ptr f.b 這裡ptr是b的位址,而不是它指向的位址。根據c語言對struct型別的儲存特性,我們可以畫這麼乙個圖示 通過分析圖示,我們可以看出,我們只...

已知結構體成員位址,求該結構體的位址

參考 list entry 的方法 list entry get the struct for this entry ptr the struct list head pointer.type the type of the struct this is embedded in.member the...

目的 獲取乙個結構體成員相對於該結構首位址的偏移量

c 如下 include define get offset data,member size t typeof data 0 member typedef struct studentstudent t int main int argc,char const ar 分析如下 1.typeof 關...