目录

  • 前言
  • offsetof介绍
  • 模拟实现

前言

本文介绍并模拟实现宏offsetof


offsetof介绍

格式:offsetof(type, member)
头文件:<stddef.h>
这个宏有两个参数:

type是一个结构体类型或联合类型;
member是结构体或联合的某一个成员

功能:返回成员相对于结构或联合起始地址的偏移量(以字节为单位),返回类型是size_t


模拟实现

结构体起始地址加上该成员相对于起始地址的偏移量就是成员变量的地址
想要知道成员相对于结构体起始地址的偏移量,假设结构体起始地址位于0地址处,那么结构体成员变量的地址强制类型转换size_t相当于该成员相对于起始地址的偏移量

#define OFFSETOF(type, member) (size_t)( &( ( ( type* )0 ) -> member) )
  1. 把整数0强制类型转换为type*类型,相当于一个结构体的起始地址位于0地址处;
  2. 接着通过箭头访问操作符访问结构体成员member,相当于找到了结构体成员member
  3. 取出结构体成员member的地址并强制类型转换为size_t类型;

例子:

#include <stdio.h>
#include <stddef.h>
#define OFFSETOF(type, member) (size_t)(&(((type*)0)->member))struct S {int a;//0~3char b;//4//5short c;//6~7
};
int main() {printf("%d\n", offsetof(struct S, a));printf("%d\n", offsetof(struct S, b));printf("%d\n", offsetof(struct S, c));printf("%d\n", OFFSETOF(struct S, a));printf("%d\n", OFFSETOF(struct S, b));printf("%d\n", OFFSETOF(struct S, c));return 0;
}

运行结果:


END

offsetof宏的模拟实现相关推荐

  1. offsetof宏和container_of宏

    文章目录 1 offsetof宏 1.1 宏的作用 1.2 编译器做了什么 2 container_of宏 2.1 ({})是什么? 2.2 typeof 2.3 原理分析 1 offsetof宏 1 ...

  2. 自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解

    如题所述,最近时间在复习C语言.自己实现了一个C语言例程,以加深对宏.大小端.typeof宏.offsetof宏.指针变量.结构体.联合体的理解.关于细分知识后续有空再填充- swap宏的使用: 对应 ...

  3. Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)

    最近一头扎进了 Linux 内核的学习中,Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与算法.操作系统原理.计算机组成原理.计算机体系结构.在囫囵吞枣补完一些计算机基 ...

  4. Offsetof宏详解

    C语言面试的时候可能会考,这样的宏定义: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) 函数作用:计算结构体 ...

  5. offsetof宏的实现(c语言)

    offsetof是一个宏,不是函数.它可以计算结构体的偏移量. 它的用例. /* offsetof example */ #include <stdio.h> /* printf */ # ...

  6. container_of 和 offsetof 宏详解

    在linux内核链表中,会遇到两个宏. 在include/linux/stddef.h中,有这样的定义 #define offsetof(TYPE, MEMBER) ((size_t) &(( ...

  7. 谈谈C语言中结构体内存对齐问题及其offsetof宏的基本使用

    前言 在C语言中,变量在内存中摆放的位置是有一定的规则的,不是想摆放到哪里就摆放到哪里,就比如常见的局部变量在栈区,全局变量在全局区等方式:而今天我们聊的结构体里面的成员变量呀,也是有一定的规则存放在 ...

  8. 程序员内功心法之程序环境和预处理

    文章目录 一.程序的翻译环境和执行环境 1.翻译环境 2.执行环境 二.编译的具体过程 1.预处理 2.编译 3.汇编 三.链接的具体过程 四.编译器调用函数的规则 五.预处理操作 1.预处理符号 2 ...

  9. 找单生狗,模拟atoi,模拟offsetof,交换奇偶位

    文章目录 1. 找单身狗 思路 代码 2. 模拟实现atoi 思路 代码 3. 实现offsetof宏 思路 代码 4. 交换奇偶位 思路 代码 1. 找单身狗 思路 要找出不同的数首先想到异或,由于 ...

最新文章

  1. Java中的深浅拷贝问题你清楚吗?
  2. 数学公式识别神器—Mathpix Snip
  3. 参加MS CRM2011深度培训课程第二天
  4. 内存管理,数据类型的基本使用与基本运算符(python2中与用户交互)
  5. Dynamo:亚马逊的高可用键值存储
  6. Python获取随机字母
  7. 数据分析:星巴克店铺分布有何规律?
  8. 抽象类,接口,魔术方法
  9. Kaggle数据增强攻略来了!不氪金实现50种语言互译
  10. 树莓派百度云下载工具bypy
  11. 原生js发送ajax请求
  12. C# globle应用
  13. SO – Shipping – Move Order Staus: BackOrder – 做搬运无法移仓
  14. 关于Bootstrap 中使用Tooltips不生效的问题
  15. 关于研发过程中测试工作的一些思考
  16. 欧洲上班族心碎:工作时网聊将无隐私可言
  17. 微信小程序开发使用onreachBottom实现页面触底加载及分页
  18. WEB、WEB标准、W3C的理解
  19. LoadLibrary failed with error 1114:动态链接库(DLL)初始化例程失败 解决方法
  20. freebsd和linux服务器,我看Linux与FreeBSD

热门文章

  1. 创新实训(46)——基于ElasticSearch的Completion Suggest实现搜索提示
  2. 如何查看mysql库中表的创建语句
  3. MySQL主键约束-PRIMARY KEY
  4. sequoia部署模型
  5. 超表面远场三维辐射图,MATLAB
  6. 俄勒冈大学计算机科学专业,俄勒冈大学计算机
  7. Spring Boot优缺点总结
  8. Hair卡通渲染的效果(各向异性)
  9. 解决docker权限不足问题
  10. win系统在虚拟机中启动黑屏的处理办法