根据结构体成员地址,获取整个结构体的首地址,在Linux系统、鸿蒙lite os操作系统中是一个很重要的功能。
在Linux系统中是通过container_of宏函数实现的
container_of通过结构体内某个成员的地址和该成员的名字,以及结构体类型,找到该结构体变量的首地址。
在鸿蒙Lite os中是通过LOS_DL_LIST_ENTRY宏函数实现的
LOS_DL_LIST_ENTRY通过结构体内某个成员变量的地址和该成员的名字,以及数据结构体类型,找到该结构体变量的首地址。
思路文章来源:https://www.toymoban.com/news/detail-680145.html
具体的实现其实就是我前面结构体与动态内存章节开始说的结构体数据对齐去寻找到首地址的。文章来源地址https://www.toymoban.com/news/detail-680145.html
- 计算偏移量;
- 根据已知的成员地址计算结构体变量的首地址。
/*
@((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 *类型
到了这里,关于如何根据结构体中成员的地址获取整个结构体的首地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!