Linux 內核源碼
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->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類型結構體的起始地址