list_entry通俗理解方法

大家都知道list_entry時kernel裏面經常遇到的一個函數,其定義爲:

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

#define container_of(ptr, type, member) ({			\
	const typeof( ((type *)0)->member ) *__mptr = (ptr);	\---------------------(1)
	(type *)( (char *)__mptr - offsetof(type,member) );})-------------------------(2)

看到這幾行代碼,說實話網上講了很多,但是很難理解,什麼指針,什麼typeof,什麼offsetof,看不懂,先說意思:

list_entry表示在找出ptr指向的鏈表節點所在的type類型的結構體首地址,member時type類型結構體成員。

再說參數:

ptr:表示和member同爲相同類型的鏈表,此處ptr表示指向鏈表中的一個節點

type:表示需要尋找的結構體類型。

member:表示type類型的結構體裏面的成員。

這裏有一個通俗的理解:

(1)實際上就是__mptr = (ptr),以0爲type結構體的首地址,將參數ptr的指針值賦值給當前結構體的member,(前面的typeof( ((type *)0)->member )不用理睬,合法性檢查而已,這條語句的目的所在)。

(2)用當前節點地址ptr值剪掉member離type結構體首地址的距離,最後就得到了ptr節點指向的節點的type類型結構體的首地址。

示意圖如下:

獲取ptr指向的節點的struct type結構體的首地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章