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

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

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

    2024年02月11日
    浏览(41)
  • 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日
    浏览(48)
  • 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日
    浏览(41)
  • 解决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日
    浏览(43)
  • 关于打开keil工程文件是出现“contains an incorrect path”现象

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

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

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

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

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

    2024年02月03日
    浏览(40)
  • 【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日
    浏览(44)
  • 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日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包