一年后再次回头看container_of宏的作用

container_of宏在很久以前的文章我就已经有分析写过了,但是看回去,感觉以前自己对这个宏的表达描述分析能力还是有待提高,毕竟那时候刚接触linux内核不久,整个人都懵懵哒,无法说得让别人通俗易懂。

那么这个宏整体是什么样子的呢?

//获取结构体成员相对于结构体的偏移
#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)
//通过获取结构体中的某个成员,反推该结构体的指针
#define container_of(ptr, type , member) ({ \
	const typeof(((type *)0)->member) *__mptr = (ptr) ; \
	(type *)((char *)__mptr - offsetof(type,member)) ;})

作用:通过某个结构体中的某个成员变量的指针,反推这个结构体变量的指针。说白了,我定义一个结构体变量和结构体指针,变量.结构体中某一个成员(这个我是知道的),还有知道它的地址,也就是&(变量.结构体中某一个成员),通过这两个参数,还有结构体的type,返回得到的就是结构体的首地址。

工作原理:

先用typeof获取变量的数据类型,也就是member成员的类型,然后将member这个成员 的指针转成自己类型的指针,再从offsetof相减,就得到整个结构体变量的首地址了,再将该地址强制转化为type *。

关于offsetof的作用就不再阐述,文章超链接在这:Offsetof宏的作用和原理

接下来看看如何使用吧,也很简单。

#include <stdio.h>
#include <stdlib.h>
//获取结构体成员相对于结构体的偏移
#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)
//通过获取结构体中的某个成员的,反推该结构体的指针
#define container_of(ptr, type , member) ({ \
	const typeof(((type *)0)->member) *__mptr = (ptr) ; \
	(type *)((char *)__mptr - offsetof(type,member)) ;})

#pragma pack(4)
struct ptr
{
    char a ;
    short b ;
    int  c ;
    double d ;
};
#pragma pack()
int main(void)
{
    struct ptr Pt ;
    struct ptr *pt ;
    printf("ptr:%d\n",sizeof(struct ptr));//16
    //获取结构体的首地址
    printf("ptr:%p\n",&Pt); //0028FEA8
    Pt.a = 'a';
    Pt.b = 2 ;
    Pt.c = 4 ;
    Pt.d = 12.04 ;
    //通过container_of获取结构体的首地址
    pt = container_of(&Pt.c, struct ptr , c);
    printf("pt:%p\n",pt);  //0028FEA8
    printf("a:%c\n",pt->a) ;  //'a'
    printf("b:%d\n",pt->b) ;  //2
    printf("c:%d\n",pt->c) ;  //4
    printf("d:%.2lf\n",pt->d);//12.04
    return 0 ;
}  
时间: 2024-09-19 09:54:05

一年后再次回头看container_of宏的作用的相关文章

编译器-关于linux kernel中的container_of宏的困惑

问题描述 关于linux kernel中的container_of宏的困惑 #define container_of(ptr, type, member) ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) 最近在看linux kernel中的链表操作, 看到了如上这个宏, 其实表达的意思很简单, 但是他要用一个__mptr来指向

offsetof与container_of宏[总结]

1.前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大.offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址.两个宏设计的很巧妙,值得学习.linux内核中有着两个宏的定义,并在链表结构中得到应用.不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了.后续认真研究一下这个链表结构. 2.offsetof宏 使用offsetof宏需要包含stddef.h头文件,实例可

李嘉诚五年后再次跻身前10

谁是全球最富有的人?谁是亚洲首富?谁又是中国内地身价最高的人?昨日,<福布斯>2012年全球亿万富豪榜新鲜出炉.墨西哥电信巨头卡洛斯-斯利姆(Carlos Slim)连续三年登顶全球首富,其个人财富估计为690亿美元,领先于微软创始人比尔·盖茨的610亿美元和"股神"沃伦·巴菲特的440亿美元:华人首富李嘉诚以255亿美元身价排名第九,在2008年跌出前十五名后,再次跻身富豪榜前十:百度CEO李彦宏以102亿美元身价,蝉联中国内地首富.这也是中国内地富豪身价首次超过100亿

2016年网络安全:向前看不如回头看

与其试图搞清将会发生什么,不如处理好现存的各种问题. 每年伊始的时候,厂商和科技预测师之类的总要对IT安全的未来做一番前瞻预言.这是可以理解的,毕竟能帮助人们辨别即将到来的威胁和新兴趋势.但事实真相却是:对广大IT用户而言,当前现有的威胁才是最应该关注的. 网络犯罪是一门产业,与大多数现代产业一样,传播速度和市场大小才是成功的关键.这也是为什么漏洞利用工具包,比如Angler.Rig之类的,在2015年大为流行,且将在未来几年继续保持广为传播势头的原因.漏洞利用工具包可以使潜在攻击者轻易侵入用户

五年后回头看:小扎10亿美元买下Instagram太超值了

扎克伯格和Instagram CEO凯文·斯特罗姆(左) 五年前,Facebook花10亿美元买下了图片分享应用Instagram,扎克伯格做出这项战略决定时,Instagram用户只有3000万,而且营收几乎为零.不过,五年后回看这笔收购时,我们不得不佩服扎克伯格的前瞻性. 如今的Instagram用户已经突破6亿,许多分析师认为它将为Facebook带来数十亿美元的广告收入. 这笔交易现在看起来简直像Facebook捡了漏,但当时小扎可是力排众议,毕竟Facebook正在要IPO的节骨眼上,

王小丫被曝再婚离婚多年后再次找到意中人(图)

一直以精明干练的形象出现在央视经济频道的美女主持人王小丫自离婚后,她的感情生活便一直成为人们关心的话题,坊间也几度传出其再婚的消息,但都被她否认.不过,近日,一位知情人士透露,王小丫这次真的结婚了.看来离婚多年后,王小丫又再次踏上了幸福之路. 据知情人士透露,因新郎身份特殊,王小丫再婚的事情特别低调.记者试图采访王小丫身边的好友证实此事,不过到截稿之前导演米家山.主持人李佳明都没有接听电话. 据了解,王小丫从四川"北漂"至北京成为央视的著名主持人之前,曾经有过一段长达7年的婚姻,这也是

回头看:科技提案能有多大用

中介交易 SEO诊断 淘宝客 云主机 技术大厅 文/张娟 又到一年两会时,IT圈的大佬又开始为自己的行业提案,但提案不一定被立案,立案最后不一定立法.要推动一项政策的建立和实施谈何容易,我们盘点了一下前几年IT大佬的提案,发现落实者寥寥,提案呼吁的性质大于实质,最终变成我们的自High. 2012年: 一.中国移动董事长王建宙:三网融合 提案要点:加快"三网融合";通过云计算平台提供安全.可靠.可拓展的信息技术设施;加快制定和完善物联网发展的总体规划和相关技术标准. 现状:三网融合还在

由云计算回头看传统互联的发展新模式

严格意义上来说,云计算并不是一个新名词.可以说它既不是一项新技术,也不是一个新概念,甚至于连云计算这个词本身是否恰当也是问题.云的概念绝不仅仅是针对计算而言的,这是IT系统建设领域的一个总体方针和未来大势.这代表着一个崭新的IT时代. 早在二十一世纪初的时候,IBM就曾经提出过On Demand会随需而变,HP也提出过Utility Computing的效用计算,H3C则提出过IToIP.甚至在上个世纪90年代中叶,全世界范围内就出现过一批以ASP(应用服务商).SSP(存储服务商)为运营模式的

舞蹈网游《Mstar》一年后再次归来

1月6日消息,2009年下半年在韩国关闭运营服务的奢华俱乐部舞蹈网游<Mstar>,经由长达一年多时间的修改与调整,通过CJ网络代理后,即日起展开首测玩家的招募工作,宣告游戏再次归来. 2009年8月底,Nurien Soft公司宣布在韩国已公测8个月之久的<Mstar>即将停止游戏服务.对此,外界纷纷猜测游戏将走向停运,更有韩媒爆料<Mstar>运营状态不佳,在线人数只有几百人. 随后,Nurien Software发表官方声明称,<Mstar>停止服务不