通過結構體的一個成員獲取結構體起始地址

Linux 內核源碼

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 

/**
 * container_of - 通過結構體的一個成員獲取容器結構體的指針
 * @ptr: 指向成員的指針。
 * @type: 成員所嵌入的容器結構體類型。
 * @member: 結構體中的成員名。
 */
#define container_of(ptr, type, member) ({          
        const typeof(((type *)0)->member)*__mptr = (ptr); 
        (type *)( (char *)__mptr - offsetof(type,member) );
        })  

分析

const typeof(((type *)0)->member)*__mptr = (ptr); 

#1. typeof # C語言庫函數關鍵字(GNU標準),獲得一個變量的類型
#2. (type*)0->member:0地址轉換爲type結構的首地址(僞地址),然後獲取該結構中member的數據類型
#3. typeof(((type *)0)->member)*__mptr = (ptr); 定義一個__mptr 指針變量,類型和member的類型一樣,求出ptr的相對於0地址(僞地址)的絕對地址
#4. (type *)( (char *)__mptr - offsetof(type,member):獲取該結構中member域的指針,也就是獲得了member在type結構中的偏移量
# 二者相減,於是得到type類型結構體的起始地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章