container_of函数是linux内核中使用很频繁的一个函数,一直没有认真的思考这个函数怎么用,有什么作用,今天通过在应用层写了一个简单的函数来查明该函数的作用,即从根据结构体成员的一个指针的地址来既得整个结构体的地址。
-
#include <stdio.h>
-
#include <linux/kernel.h>
-
struct student {
-
char name[20];
-
char sex;
-
};
-
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-
#define container_of(ptr, type, member) ({ \
-
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
-
(type *)( (char *)__mptr - offsetof(type,member) );})
-
int main()
-
{
-
struct student st={"zhangsan",'m'};
-
struct student *tmp;
-
char *ptr_name=st.name;
-
tmp=container_of(ptr_name,struct student,name);
-
printf("tmp->name=%s\n",tmp->name);
-
printf("tmp->sex=%c\n",tmp->sex);
-
return 0;
-
}
-
在使用过程中,主要考虑第一个和第三个参数,第一个为已知的结构体成员地址,第三个参数是结构体成员变量名字,该函数通过这两个参数返回结构成员所在的结构体的首地址。
运行结果如下
linuxwang:/home/test # ./container_of
tmp->name=zhangsan
tmp->sex=m
linuxwang:/home/test #
阅读(1822) | 评论(0) | 转发(0) |