container_of(ptr,type,member)宏

简介: 详细解释了container_of(ptr,type,member)宏的用途

1、作用
已知结构体type的成员member的地址ptr,计算出type结构体的首地址。

2、原型

define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

define container_of(ptr, type, member) ({ \

    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})

3、typeof关键字
  typeof的作用就是获取对象的数据类型。typeof没有被定义在C标准库中,而是GNU C的拓展。用法如下:
int a = 0;

typeof(a) b = 1; //b的数据类型是int

4、零值指针
零值指针顾名思义就是值为0的指针,即地址为0,同时其可以是任何类型的指针,可以是void,char,int*等等。

5、offset()宏获取偏移地址
  offset()获取偏移地址就是巧妙地应用了0地址指针,将0指针强制转化为所指定的type类型,再通过其访问结构体内成员,并通过&获取成员的地址。由于该强制转化而来的结构体位于0地址,所以获取的成员的地址即是该成员与结构体起始地址的偏移地址。

6、container_of()宏解析
const typeof( ((type )0)->member ) mptr = (ptr); //定义一个临时指针变量mptr,类型是结构体成员member的数据类型

(type )( (char )__mptr - offsetof(type,member) ) //结构体成员地址减去偏移量就是结构体的首地址

相关文章
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
40006 184
|
安全 物联网 Linux
AliOS Things 物联网操作系统介绍
AliOS Things 物联网操作系统介绍
14674 1
AliOS Things 物联网操作系统介绍
|
算法 Java Linux
7-zip 压缩算法及C SDK使用
7-zip 压缩算法及C SDK使用
2281 0
|
存储 数据管理 数据处理
处理STM32 DMA方式下的HAL_UART_ERROR_ORE错误
通过正确配置UART和DMA、实现有效的错误处理回调函数以及优化数据处理和缓冲区管理,可以有效处理STM32中DMA方式下的 `HAL_UART_ERROR_ORE`错误。这些方法确保了数据的高效传输和处理,避免了因数据溢出导致的通信中断和数据丢失。希望这些解决方案能够帮助您在实际应用中更好地应对和解决此类问题。
2981 0
STM32CubeMX RS485接口使用
STM32CubeMX RS485接口使用
2965 8
|
机器学习/深度学习 算法 决策智能
无约束最优化(四) 步长加速法
无约束最优化(四) 步长加速法
764 0
无约束最优化(四) 步长加速法
【免费资料】IEEE33节点系统参数及拓扑图visio
初学者入门配电网可参考经典的IEEE 33节点系统,此系统在文献中广泛应用。资源包括节点和支路参数的Excel表格及Visio的网络拓扑图,可免费下载。配电网以闭环设计增强灵活性和可靠性,故障恢复涉及网络拓扑约束。提供的MATLAB相关链接探讨了孤岛、重构及故障恢复策略。
vscode 如何修改c/c++格式化风格,大括号不换行
vscode 如何修改c/c++格式化风格,大括号不换行