关于函数宏offset_of 和 container_of的学习

这篇具有很好参考价值的文章主要介绍了关于函数宏offset_of 和 container_of的学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#define offset_of(type, member)   ((unsigned int)&((type*)0)->member)
#define container_of(ptr, type, member)     ((type *)((char *)(ptr) - offset_of(type, member)))

offset_of(type, member)

用途: 用于获取获取结构体某一个成员在该结构体中的位置

参数1:type ,表示结构体的类型

参数2:member  表示结构体成员

分析:

(unsigned int)  & (type*)0)->member   a.把值为0的指针强制转换成该结构体类型

                 b.通过该指针找到该成员
                    c.获取该成员相对于0 的地址偏移
                 d.强转成整形
 

container_of(ptr, type, member)

用途: 知道结构体中某一个成员的地址,需要获取到整个结构体的指针,通过该指针获取其他成员变量的数据

参数1:ptr,某一个成员的地址

参数2:type  结构体类型

参数3:member 该成员的名字 

分析:

(type *)((char *)(ptr) - offset_of(type, member))

                    a.获取该成员相对于结构体指针的偏移文章来源地址https://www.toymoban.com/news/detail-748128.html

                 b.将该成员的地址转换成char*类型,该指针指向1byte的数据
                    c.转换成结构体类型的指针
                 d.使用该结构体成员的指针 - 该成员相对于结构体指针的偏移 = 结构体指针
 
 

注意事项:

使用gcc编译的时候有遇到此问题:warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
这是一个编译器警告,指示在某一行代码中进行了从指针到整数的类型转换,而且这两者的大小不同。
 (unsigned int)  & (type*)0)->member 中,由于我是在32位单片机中使用,所以unsigned int与地址长度相同。
如果在其他不同的系统中需注意该指针的强制转换问题,可以使用uintptr_t来解决跨平台的问题。
该类型定义在c库<stdint.h>
 

到了这里,关于关于函数宏offset_of 和 container_of的学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Linux第73步_学习Linux设备树和“OF函数”

    Linux第73步_学习Linux设备树和“OF函数”

    掌握设备树是 Linux驱动开发人员必备的技能 ! 1、了解设备树文件 在3.x版本以前的Linux内核源码中,存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹,里面很多个“.c”和“.h”文件,它们用来描述设备信息。而现在的ARM架构是采用“设备树”来描述设备信息。“设备树

    2024年03月12日
    浏览(6)
  • runtime error: addition of unsigned offset to 0x602000000130 overflowed to 0x60200000012c (stl_vecto

    非常细节的数组越界问题!!! 先看出错部分源码: 这是正确代码: 错误原因很简单, 因为j--后没有立即进行判断,即j--后可能使得j=-1,然后直接访问matrix[i][-1],导致数组越界, 所以这里加上continue强制进行下一循环判断。

    2024年02月11日
    浏览(7)
  • kafka消费者报错Offset commit ......it is likely that the consumer was kicked out of the group的解决

    2022年10月份接到一个小功能,对接kafka将数据写到数据库,开始的需求就是无脑批量insert,随着时间的推移,业务需求有变更,kafka的生产消息频次越来越高,到今年7月份为止就每秒会有几十条甚至上百条,然后消费消息的代码就报错: Caused by: org.apache.kafka.clients.consumer.Com

    2024年02月07日
    浏览(12)
  • flink-cdc-mysql The MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match

    报错信息 MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match the configured timezone Asia/Shanghai. Specify the right server-time-zone to avoid inconsistencies for time-related fields. 查看mysql配置 这时候你如果设置 **serverTimeZone(“Asia/Shanghai”)**会报错 可以使用命令设置 接下来就可以正常链

    2024年02月11日
    浏览(9)
  • 解决Correct the classpath of your application so that it contains compatible versions

    解决Correct the classpath of your application so that it contains compatible versions

    springboot启动失败 报错Correct the classpath of your application so that it contains compatible versions of the classes org.springframework.web.servlet.handler.AbstractHandlerMethodMapping and org.springframework.web.method.HandlerMethod 排查发现:pom依赖同时引用了两个不同版本的web包。 删掉一个web依赖重新构建以后问题直

    2024年02月09日
    浏览(24)
  • 关于打开keil工程文件是出现“contains an incorrect path”现象

    关于打开keil工程文件是出现“contains an incorrect path”现象

    复制一个工程文件,打开工程最后出现“contains an incorrect path” 进行全局编译,并无异常,烧录两台设备其中一台烧录正常,一台出现以下现象:即“content mismatch at :0x00XXXXXXX”  单片机实际FLASH为128K  编译后仅使用40多K,应该不是程序过大导致  尝试用小些(约38K)程序烧

    2024年02月15日
    浏览(9)
  • HiveSQL题——array_contains函数

    HiveSQL题——array_contains函数

    目录 一、原创文章被引用次数 0 问题描述 1 数据准备 2 数据分析 ​编辑 3 小结 二、学生退费人数 0 问题描述 1 数据准备 2 数据分析 3 小结 0 问题描述    求原创文章被引用的次数,注意本题不能用关联的形式求解。 1 数据准备    id表示文章id,oid表示引用的其他文章id,当

    2024年04月23日
    浏览(8)
  • MySQL 中的 JSON_CONTAINS 函数详解

    在处理 MySQL 中的 JSON 数据时,我们经常需要检查一个 JSON 文档是否包含特定的值。这时, JSON_CONTAINS 函数就显得非常有用。 JSON_CONTAINS 是 MySQL 提供的一个 JSON 函数,用于测试一个 JSON 文档是否包含特定的值。如果包含则返回 1,否则返回 0。该函数接受三个参数: target : 待搜

    2024年02月03日
    浏览(8)
  • 【Java遇错】Correct the classpath of your application so that it contains a single, compatible version..

    【Java遇错】Correct the classpath of your application so that it contains a single, compatible version..

    问题描述: 启动服务出现以下错误: 启动测试出现以下错误: 问题原因: 错误:Correct the classpath of your application so that it contains a single, compatible version of com.baomidou.mybatisplus.core.toolkit.ReflectionKit(更正应用程序的类路径,使其包含com.baomidou.mybatisplus.core.toolkit.ReflectionKit的单个

    2024年02月03日
    浏览(12)
  • 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘se

     Navicat Premium 16 版本 这个错误是由于 MySQL 的新版本中默认开启了 ONLY_FULL_GROUP_BY 模式,即在 GROUP BY 语句中的 SELECT 列表中,只能包含分组或聚合函数,不能包含其他列。而你的查询语句中出现了一个列 senior_two.score.student_id ,它既没有被分组也没有被聚合,因此 MySQL 报出了这

    2024年02月15日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包