list_entry,計算機語言,原理是指針ptr指向結構體type成員member。
基本介紹
- 中文名:list_entry
- 定義: get the struct for this entry
- 原理:指針ptr向結構體type成員member
- 解釋:&((type *)0)->member
定義,描述,例子,解釋,
定義
/* 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 name of the list_struct within the struct.*/
#define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
描述
我們使用list_entry()宏在linux鍊表中訪問鍊表數據。
定義中((unsigned long) &((type *)0)->member)意為:把0地址轉化為type結構的指針,然後獲取該結構中member成員的指針,並將其強制轉換為unsigned long類型
例子
如果我們有test_list結構:
struct test_list{
int testdata;
struct list_head list;};
struct test_list a;
a.testdata = 5;
struct test_list *pos = list_entry(&(a.testdata),struct test_list,testdata);
結果:
pos = &a;
可測試:
pos->testdata = 5
解釋
&((type *)0)->member:
把0強制轉化為指針類型,即0是一個地址,為段基址。取以0為結構體基址的結構體的域變數member的地址,那么這個地址就等於member域到結構體基地址的偏移位元組數。
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))):
ptr是指向類型為type的某結構體中的成員member的指針,減去該member在結構體中的偏移量,即得到該結構體的起始地址。