list_entry

list_entry,計算機語言,原理是指針ptr指向結構體type成員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鍊表中訪問鍊表數據。

原理為指針ptr指向結構體type中的成員member;通過指針ptr,返回結構體type的起始地址。

定義中((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在結構體中的偏移量,即得到該結構體的起始地址。

相關詞條

熱門詞條

聯絡我們