offsetof宏的原理以及作用
原理 以及 作用
2023-09-27 14:28:47 时间
虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。
作用:为接下来的container_of宏的讲解出现做铺垫
offsetof宏: #define offsetof(TYPE,MEMBER) ((int) ((TYPE *)0)- MEMBER)
接下来看看例程就明白了,其实这个宏挺简单的, ((TYPE *)0)- MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。
你是真的“C”——宏与函数的英雄本色 一、何为宏? 在进行宏和函数的对比时,我们先了解一下什么是宏。 #define 定义宏 #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。 下面是宏的申明方式: #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。
原理:
虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。
作用:为接下来的container_of宏的讲解出现做铺垫
offsetof宏: #define offsetof(TYPE,MEMBER) ((int) ((TYPE *)0)- MEMBER)
接下来看看例程就明白了,其实这个宏挺简单的, ((TYPE *)0)- MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。
#include stdio.h #define offsetof(TYPE,MEMBER) ((int) ((TYPE *)0)- MEMBER) #pragma pack(4) struct ptr char a ; short b ; int c ; double d ; #pragma pack() int main(void) struct ptr Pt ; printf("ptr:%d\n",sizeof(struct ptr));//16 //相对地址偏移量 int offset = offsetof(struct ptr,a); //0 printf("offset:%d\n",offset); int offset1 = offsetof(struct ptr,b); //2 printf("offset1:%d\n",offset1); int offset2 = offsetof(struct ptr,c); //4 printf("offset2:%d\n",offset2); int offset3 = offsetof(struct ptr,d); //8 printf("offset3:%d\n",offset3); return 0 ; }
你是真的“C”——宏与函数的英雄本色 一、何为宏? 在进行宏和函数的对比时,我们先了解一下什么是宏。 #define 定义宏 #define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。 下面是宏的申明方式: #define name( parament-list ) stuff 其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
morixinguan ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。
相关文章
- Elasticsearch 学习笔记(一)-----Lucene的简介以及索引原理
- 全网呕血整理:关于YOLO v3原理分析
- 【机器学习】ICA 原理以及相关概率论,信息论知识简介
- 漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)
- 逆向课程第五讲逆向中的优化方式,除法原理,以及除法优化下
- SSH原理与运用(一):远程登录
- [转]SSH 原理和基本使用:ssh 安全配置 以及ssh key 认证登录
- 一份微服务架构手稿图,彻底搞定微服务核心原理!
- Android SoundPool 的使用以及原理分析
- 计算机组成原理:第五章测试题
- 一文彻底搞懂mysql binlog redolog undolog 作用原理以及运行机制
- 转:常见加密算法分,用途,原理以及比较
- ofbiz框架以及核心原理介绍
- java 二维码原理以及用java实现的二维码的生成、解码(转)
- Java三大器之过滤器(Filter)的工作原理和代码演示
- T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他
- React hook 以及 React Fiber 原理
- Python+moviepy音视频剪辑:视频帧数据的本质、Clip的fl方法进行变换处理的原理以及滚屏案例
- NetLink通信原理研究、Netlink底层源码分析、以及基于Netlink_Connector套接字监控系统进程行为技术研究
- 超声波倒车雷达电路图及原理分析
- RAC3——RAC原理开始
- 【Jetty】Jetty 的工作原理以及与 Tomcat 的比较
- 2019-10-18-WPF-高速书写-StylusPlugIn-原理
- 一文读懂 HugePages(大内存页)的原理
- Java并发编程:ThreadLocal的使用以及实现原理解析
- 移动开发之【微信小程序】的原理与权限问题以及相关的简易教程
- 【jvm我能讲两小时060】G1收集器的Region堆内存布局时什么原理?
- 服务端模板注入攻击原理以及实战(SSTI)