Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96287
  • 博文数量: 17
  • 博客积分: 37
  • 博客等级: 民兵
  • 技术积分: 217
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-09 18:24
文章分类
文章存档

2016年(4)

2015年(3)

2014年(9)

2011年(1)

我的朋友

分类: LINUX

2014-04-18 11:07:05

container_of函数是linux内核中使用很频繁的一个函数,一直没有认真的思考这个函数怎么用,有什么作用,今天通过在应用层写了一个简单的函数来查明该函数的作用,即从根据结构体成员的一个指针的地址来既得整个结构体的地址。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <linux/kernel.h>
  3. struct student {
  4.         char name[20];
  5.         char sex;
  6. };
  7. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  8. #define container_of(ptr, type, member) ({ \
  9.         const typeof( ((type *)0)->member ) *__mptr = (ptr); \
  10.         (type *)( (char *)__mptr - offsetof(type,member) );})
  11. int main()
  12. {
  13.         struct student st={"zhangsan",'m'};
  14.         struct student *tmp;
  15.         char *ptr_name=st.name;
  16.         tmp=container_of(ptr_name,struct student,name);
  17.         printf("tmp->name=%s\n",tmp->name);
  18.         printf("tmp->sex=%c\n",tmp->sex);
  19.         return 0;
  20. }
在使用过程中,主要考虑第一个和第三个参数,第一个为已知的结构体成员地址,第三个参数是结构体成员变量名字,该函数通过这两个参数返回结构成员所在的结构体的首地址。
运行结果如下 
linuxwang:/home/test # ./container_of 
tmp->name=zhangsan
tmp->sex=m
linuxwang:/home/test # 


阅读(1775) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~