container_of
时间: 2023-11-20 10:07:00 浏览: 84
`container_of` 是一个在 Linux 内核中经常使用的宏,用于根据一个结构体中的某个字段获取整个结构体的指针。通常用于实现链表等数据结构。
该宏的定义如下:
```
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
```
其中,`ptr` 是指向结构体中某个字段的指针,`type` 是结构体类型,`member` 是结构体中的成员字段名称。该宏的返回值是指向整个结构体的指针。
举个例子,假设有以下结构体定义:
```
struct student {
char name[20];
int age;
struct list_head list;
};
```
其中,`list` 是一个链表节点结构体,`list_head` 是链表头结构体。如果需要根据链表节点指针获取整个 `student` 结构体的指针,可以使用 `container_of` 宏:
```
struct student *stu;
struct list_head *pos;
list_for_each(pos, &stu_list) {
stu = container_of(pos, struct student, list);
/* 对 stu 进行操作 */
}
```
以上代码中,`pos` 是链表节点指针,`&stu_list` 是链表头指针。通过 `container_of` 宏可以获取整个 `student` 结构体的指针,从而对其进行操作。
阅读全文