代码位置:include/linux/...
container_of
cast a member of a structure out to the containing structure
根据结构体成员变量找到这个结构体入口,从而可以操作结构体中其他成员
ptr:the pointer to the member.
type:the type of the container struct this is embedded in.
member:the name of the member within the struct.
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offset_of(type, member)); })
offset_of是根据成员变量获得
#define offset_of(type, member) ((char *)&((type *)0)->member)
list_entry是获得结构体的入口地址
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
举个例子吧
#include <stdio.h>
#include <stdlib.h>
#define offset_of(type, member) ((char *)&((type *)0)->member)
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offset_of(type, member)); })
struct Grade {
int math;
int art;
}
struct Student {
char* name;
int age;
struct Grade grade;
}
int main()
{
struct Grade *gra = (struct Grade *)malloc(sizeof(struct Grade));
gra->math = 99;
gra->art = 100;
struct Student stu1 = {"lihua", 15, *gra};
struct Student *stu2 = container_of(&stu1.grade, struct Student, grade)
printf("stu1 addr=%x stu2 point=%x\n", &stu1, *stu2);
printf("age=%d\n", stu2->age);
free(gra);
return 0;
}
程序执行结果: