它的作用显而易见,那就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针

typedef unsigned int__kernel_size_t;
typedef __kernel_size_t        size_t;#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)/*** 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 -offsetof(type,member) );})structperson
{char name[10];intage;intnum;
} ocjPerson;int main(void)
{struct person* p =  container_of(&ocjPerson.age, structperson, age);printf("the value of p = %x\n", p);printf("the value of &ocjPerson = %x\n", &ocjPerson);return 0;
}/*打印结果:  the value of p == the value of &ocjPerson

分析:container_of(&ocjPerson.age, struct person, age);
({                      \const typeof( ((struct person *)0)->age ) *__mptr = (&ocjPerson.age);    \(struct person *)( (char *)__mptr - ((size_t) &((struct person *)0)->age) );})A. typeof是GNU C对标准C的扩展,它的作用是根据变量获取变量的类型B.#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
分析一下这个offsetof宏的运行机理:
一共4步
1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员;
3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址;
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型。巧妙之处在于将0转换成(TYPE*),结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址;*/

转载于:https://www.cnblogs.com/mylinux/p/5497391.html

linux内核代码container_of相关推荐

  1. linux 内核宏container_of剖析

    1.前面说的 我在好几年前读linux 驱动代码的时候看到这个宏,百度了好久,知道怎么用了,但是对实现过程和原理还是一知半解. container_of宏 在linux内核代码里面使用次数非常非常多, ...

  2. Linux 内核代码行数达到 2700 万行量级

    来自:技术让梦想更伟大 截止到2020年1月1日09:00:10,Linux内核Git源码树中的代码达到了2780万行. phoronix网站统计了Linux内核在进入2020年时的一些源码数据并作了 ...

  3. linux 内核编号含义_如何阅读linux内核代码?

    阅读代码从来就是不可行的方法,有篇文章详细讲了这个事,很多人都觉得应该多读代码, 读好的代码,比如Donald Knuth. 但事实上, 只要简单让你描述一下最近读了什么代码,绝大多数人都说不上.文章 ...

  4. Linux内核代码风格

    Linux内核代码风格 这是一个简短的文档,描述了linux内核的首选代码风格.代码风格是因人而异的,而且我不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格,并且我也希望 ...

  5. linux内核源码只有makefile文件没有c文件,linux内核代码的编写初步以及makefile的配置...

    在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...

  6. 最小的linux内核代码,带你阅读linux内核源码:下载源码、编译内核并运行一个最小系统...

    要学习linux内核,先要能够编译内核,还需要了解内核如何启动根文件系统.这样你才能在修改linux内核代码之后,完成验证的过程. 本文教你完成下列过程: 1.下载linux并编译linux内核源码 ...

  7. 谷歌喊话三星:别再搞 Linux 内核代码了,安卓安全也不保了

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 谷歌 Project Zero 团队表示,三星为阻止 Galaxy 手机遭攻击而修改了内核代码,但实际上引发了更多的安全漏洞. 谷歌安全 ...

  8. Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码

    CSDN GitHub Ubuntu14.04搭建LXR本地服务器阅读Linux内核代码 AderXCoding/system/tools/lxr 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  9. Linux内核代码华人贡献统计

    http://www.remword.com/kps_result/ 这个站点对Linux内核代码补丁进行了详细的统计,感兴趣的童鞋可以看一下. 在这里给大家看一下2005年4月16日至今各个国家贡献 ...

最新文章

  1. 6/29 原型编码阶段:(2) GridView的数据库操作
  2. PicCompress一个精简的图片压缩工具
  3. icmp报文格式_IPV6报文格式和IPV4有什么区别?
  4. esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...
  5. 提示错误:“应为“providerInvariantName”参数的非空字符串。”
  6. DataTable增加行
  7. 蓝桥杯 2012 决赛 拼音字母
  8. php ip纯真数据库Dat,php读取纯真ip数据库使用示例
  9. nginx 配置https 负载均衡
  10. 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  11. 谷歌退出将会给中国互联网带来的10个变化
  12. 目前市面上流行的几种VR头盔设备介绍
  13. ESP8266 NodeMCU:ESP-NOW Web 服务器传感器仪表板(ESP-NOW + Wi-Fi)
  14. 在windows下安装docker并使用
  15. Nginx:正向代理与反向代理
  16. 20P75 pr预设模板840种扭曲缩放平移变形切割光效旋转无缝视频转场
  17. 地理学优质核心期刊汇总(论文投稿必备)
  18. C/C++函数指针与函数指针数组的使用
  19. 关于node启动:File exists: node_modules\.bin\babel-doctor不成功
  20. 电脑垃圾,电脑运行慢如何彻底清除垃圾?

热门文章

  1. java中的四个指令_JAVA命令学习系列(四) ---- jstat
  2. 计算机二级office高级应用教程,2015计算机二级Office高级应用上机试题及答案
  3. git stash暂存命令
  4. HDFS基本命令及上传文件API
  5. idea 高级调试技巧
  6. Bootstrap 下拉菜单事件
  7. 【vjudge contest 418548】2021 BUAA Winter Training 3(Private),签到题ABCDG
  8. 常见网盘和云存储测评和使用方式
  9. 计算机网络八校联考试题,2019届高三信息技术3月联考试卷有解析与答案
  10. linux文件服务器迁移方案,服务器之间文件备份方案、如何把服务器文件自动备份到另外一台服务器?...