如何根据结构体中成员的地址获取整个结构体的首地址

根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。

在Linux系统中是通过container_of宏函数实现的

container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。

在鸿蒙Lite os中是通过LOS_DL_LIST_ENTRY宏函数实现的

LOS_DL_LIST_ENTRY通过结构体内某个成员变量的地址和该成员的名字,以及数据结构体类型,找到该结构体变量的首地址。

思路

具体的实现其实就是我前面结构体与动态内存章节开始说的结构体数据对齐去寻找到首地址的。

  1. 计算偏移量;
  2. 根据已知的成员地址计算结构体变量的首地址。
/*
@((TempHumiSensor *)0)//将开始地址转换成结构体指针类型,告诉编译器使用结构体类型去解释从0开始的地址
@((TempHumiSensor *)0)->temp//有了结构体指针类型,就可以访问结构体成员了
@&((TempHumiSensor *)0)->temp//有了这个成员,就可以获取成员地址了
@(uint32_t)&((TempHumiSensor *)0)->temp//将获得的偏移量转换为数值,就是偏移量转换为数值4
*/
(uint32_t)&((TempHumiSensor *)0)->temp//获得了temp在TempHumiSensor结构体中的偏移量
/*
@((uint8_t *)(0x20000404)) - (uint32_t)&((TempHumiSensor *)0)->temp//uint8_t的步长是1字节, 
                                                                     所以这里的地址为    
                                                                     0x20000404 - 4 = 
                                                                     0x20000400
*/
(TempHumiSensor *)((uint8_t *)(0x20000404)) - (uint32_t)&((TempHumiSensor *)0)->temp
//将得到的首地址装置转换为TempHumiSensor *类型                                                                                                     
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jarrett_Zheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值