list_entry
时间: 2023-10-01 13:07:45 浏览: 126
list
list_entry是一个宏定义,用于获取包含某个list_head指针的结构体的指针。该宏定义如下:
```C
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
```
其中,`ptr`是指向`list_head`的指针,`type`是包含`list_head`的结构体的类型,`member`是`list_head`在结构体中的成员名。该宏定义将`ptr`强制转换为`type`类型的结构体指针,并通过计算偏移量将`list_head`的指针转换为结构体的指针。这样就可以通过结构体指针访问到完整的结构体对象了。
举个例子,假设有以下结构体定义:
```C
typedef struct _MYDATASTRUCT {
ULONG number;
LIST_ENTRY ListEntry;
} MYDATASTRUCT, *PMYDATASTRUCT;
```
其中,`MYDATASTRUCT`是包含`LIST_ENTRY`的结构体类型。通过使用`list_entry`宏,可以方便地获取`MYDATASTRUCT`指针。
在`list_entry`宏内部,通过将`ptr`的地址减去`&((type *)0)->member`的地址,可以得到`list_head`相对于包含它的结构体起始地址的偏移量。然后将这个偏移量加上`ptr`的地址,即可得到包含`list_head`的结构体的指针。
对于`MYDATASTRUCT`来说,它的`list_head`成员是`ListEntry`,而在`list_entry`宏的使用中,`member`参数就是`ListEntry`。这样,通过调用`list_entry`宏并传入`ptr`、`MYDATASTRUCT`和`ListEntry`,就可以获取到包含`ptr`的`MYDATASTRUCT`指针了。
需要注意的是,`list_entry`宏中的0是一个虚拟的结构体指针,用于计算偏移量。实际使用时,需要将其替换为实际的结构体类型。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [list_entry的宏定义](https://blog.csdn.net/lhf0921/article/details/5474095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [LIST_ENTRY链表学习](https://blog.csdn.net/ilovemayverymuch/article/details/38742117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文