C/C++知识点之offsetof与container_of宏的理解
小标 2019-02-19 来源 : 阅读 1457 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之offsetof与container_of宏的理解,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之offsetof与container_of宏的理解,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之offsetof与container_of宏的理解


这两个是在linux内核中经常用到的两个宏,先说offsetof这个宏的作用就是来计算在结构体中的一个元素与结构体地址的偏移量。结构体的元素访问其实就是指针访问,直接应用的时候是用一个点来访问的但是其实在底层经过编译器编译后的执行程序还是用这个偏移量的地址来访问的例如定义一个结构体如下
typedef struct test{
char   t1;
int    t2;
short t3;
}test;
int main(void)
{
test s1;
s1.t1='a';
s1.t2=123;
s1.t3=456;


return 0;


}
这种用点的形式直接访问其本质是如下的:


test p;
char 
p1;
int p2;
short 
p3;
p=&s1;
p1=(char )((int)p+0)
p2=(int
)((int)p + 4);
p3=(short *)((int)p + 8);


printf("*p1 = %c.\n",*p1);
printf("*p2 = %d.\n",*p2);
printf("*p3 = %d.\n",*p3);
这样得到结构是完全正确的意思就是这个偏移量很重要,所有就产生了offsetof这个宏,他的原型是
#define offsetof(Type,Member)  ((int)&((Type*)0)->Member)
首先有两个参数Type是指这个结构体的类型名,member就是这个结构体的成员名经过这个宏之后就返回了一个×××数是这个成员变量在这个结构体中相对于结构体地址的偏移量这里边有一个(Type*)0)最不好理解意思就是假设了一个type类型的结构体他的地址是在地址0处其实这个结构体是不存在的但是这样假定使用是不会有问题的,因你又没有引用这个地址所有就没有问题了,其实返回的这个数就是这个成员的地址减去结构体的地址但是因为结构体的地址是0所有就能直接返回这个成员的地址而也正因为结构体的地址是零所有成员的地址也就正好是偏移量了。
而container_of这个宏就是在offsetof这个宏的基础上发展来的他的作用就是知道一个结构体中的成员的地址通过这个宏的运算后得到了结构体的地址,这个就厉害了因为你只要知道了结构体的指针那么你就可以得到结构体中的任何一个元素。这个宏的源型是#define container_of(ptr,type,member)  ({\


Const typeof(((type)0)->member)  mptr = (ptr);\
(type)((char)
mptr - offsetof(type,member));})


有三个参数ptr是结构体中元素的指针,type是结构体的类型名,member是这个ptr指针的结构体元素名。这个宏里第一条我觉得其实也没什么用去掉应该也可以因为他只是得到了这个结构体中成员变量的类型,之后这个成员变量的地址减去他在结构体中的偏移量那得到的就是结构体的指针在将类型强制转换为结构体指针就可以了。

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程