offsetof(TYPE, MEMBER) 是一个宏定义,用于计算一个结构体中某个成员的偏移量。

其第一个参数 TYPE 是一个结构体类型,第二个参数 MEMBER 是 TYPE 中的一个成员变量名。

它将返回类型为 size_t 的整数,表示 MEMBER 相对于 TYPE 起始地址的偏移量。

基本原理是根据 C 语言的数据对齐机制,成员变量在类型定义中的相对位置决定了它的偏移量。

以下是其实现代码:

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

该宏定义使用了C语言中的指针运算和类型转换。具体实现步骤如下:

  1. (TYPE *)0:将0转换为指向类型为TYPE的指针,得到结构体TYPE的空指针。

  2. &((TYPE *)0)->MEMBER:求出结构体类型TYPE中成员MEMBER的地址。由于空指针不指向任何对象,因此这个成员的地址就是相对于结构体首地址的偏移量。

  3. (size_t):将偏移量转换为无符号整型数,以满足C语言标准库中对offsetof()返回值的类型要求。

该宏定义可以在编译时就直接计算出偏移量,避免了运行时的计算开销,因此比通过变量名访问成员的方式更为高效。

该宏定义通常用在需要直接访问结构体成员的底层代码中,例如在操作系统内核、嵌入式系统以及一些高性能计算应用中。

例子:

struct TestStruct {  int value1;  char value2;  double value3;
};  size_t offset = offsetof(struct TestStruct, value2);

如上例,offset 变量将会存储 value2 相对于 TestStruct 起始地址的偏移量。在这种情况下,因为 TestStruct 中的 value1 占用了 4 个字节,value2 占用了 1 个字节,所以 value2 相对于结构体起始地址的偏移量应该是 4。

【最后一个bug】多平台都有更新和发布,大家可以一键三连,关注+星标,不错过精彩内容~

C语言offsetof(TYPE, MEMBER)全解相关推荐

  1. #define offsetof(TYPE, MEMBER) ((size_t) ((TYPE *)0)-MEMBER)

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 宏的运行机理: 1. ( (TYPE *)0 ) 将零转型为 ...

  2. 【C语言】Ascall码表全解

    Part1:Ascall码速查 首先,我们来放一张Ascall码的全部内容 那么Ascall码是什么呢?其实计算机在储存char的时候,在内存中保存的是ascall码的形式,char占有的是1个byt ...

  3. #define list_entry(ptr, type, member) \   container_of(ptr, type, member)

    2019独角兽企业重金招聘Python工程师标准>>> #define container_of(ptr, type, member) ({            \     con ...

  4. c语言 offsetof函数,C 库宏 - offsetof()函数

    宏offsetof 标准库stddef.h 定义 size_t offsetof(type, member); 分析 C 库宏 offsetof(type, member) 会生成一个类型为 size ...

  5. container_of(ptr, type, member)宏定义解析

    container_of()这个宏定义的功能是根据一个已知结构体成员的指针和变量名得出宿主结构体的地址 为方便理解和描述,本文中将已知的结构体成员叫做功能成员,它所在的结构体叫做宿主结构体. 先来分析 ...

  6. C语言offsetof用法以及其扩展用法

    标题C语言offsetof用法以及其扩展用法 offsetof由于不是标准库的函数,所以得查一下,在stddef.h中,搜索一下编译器的这个头文件位置: 暴力一点,直接在根目录下搜索,find -na ...

  7. 跨行合并居中html标记语言,[前端Web]HTML语法最全解-建议收藏

    原标题:[前端Web]HTML语法最全解-建议收藏 1. 标签全解 1.1 文件标记 作用:文档声明标签.定义该文档是html5的文档,位于标签前面 详解: HTML总共有很多的版本,那么浏览器怎么知 ...

  8. c语言的递归算法流程图,递归算法C语言全解.ppt

    递归算法C语言全解 第四章 递归算法 [例5]集合的划分 [问题描述] 设S是一个具有n个元素的集合,S={a1,a2,--,an},现将S划分成k个满足下列条件的子集合S1,S2,--,Sk ,且满 ...

  9. python应用系列教程——python的GUI界面编程Tkinter全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python的GUI界面编程,常用的几个python库包含如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 ...

最新文章

  1. 聊聊底线 | 坏数据与假数据
  2. VC 下 64bit 整数的显示和读取格式化字串
  3. 分布式唯一id:snowflake算法思考
  4. 图像工程CH4 频域图像增强
  5. 关于华硕主板“USB Devices Over Current Status Detected!”
  6. i9100美化android.policy.jar,摆脱越狱束缚 三星I9100安装应用更轻松
  7. archivedDataWithRootObject NSUserDefaults
  8. 华为面试题:一头牛重 800 公斤,一座桥承重 700 公斤,请问牛怎么过桥?
  9. Idea新建项目和快捷键
  10. 最好吃的月饼!用Python爬取了某宝1166家月饼进行可视化分析!
  11. 各操作系统支持图标字体的终端推荐
  12. 英伟达GPU中的Tnesor Cores数量多寡与显卡性能有什么关联?
  13. python的静态局部变量怎么定义
  14. 编译android-x86-froyo
  15. Bootstarp未读消息铃铛
  16. Unreal资源引用(一)
  17. Electron打包(windows平台)
  18. 离线文档编辑、知识管理神器:MyBase
  19. [Android NDK]修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 问题
  20. 无线烟感器(NB-IoT)

热门文章

  1. 暗黑3:教你如何从建立战网到成功购买游戏
  2. IDEA编译项目提示程序包不存在、符号错误,最终幻想
  3. 与运行其他家庭计算机共享打印机,Win10系统电脑如何在局域网中共享打印机?...
  4. IBIS仿真---SI篇(10)
  5. python 正则指北之我的总结
  6. 11 认识1-5(一上)
  7. 北京市推微博实名制之我见
  8. 速成!免费送!一份火爆国外的前沿深度学习实践课程(附链接)
  9. DP DD VTL 备份 NBU
  10. 构建一个JPEG解码器(3):霍夫曼表