list_entry

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鍊表中訪問鍊表數據。
原理為指針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在結構體中的偏移量,即得到該結構體的起始地址。

相關詞條

熱門詞條

聯絡我們