首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 !

宏offsetof的介绍 :

参数:第一个是结构体类型名称,第二个是结构体成员名

返回类型:size_t无符号整形

引用的头文件:<stddef.h>

offsetof的使用举列 :

#include <stddef.h>
struct Stu // 注释为相对于起始位置的偏移量
{int a;//0~3char c;//4//5~7double d;//8~15
};
int main()
{printf("%d\n", sizeof(struct Stu));printf("%d\n", offsetof(struct Stu, a));printf("%d\n", offsetof(struct Stu, c));printf("%d\n", offsetof(struct Stu, d));return 0;
}

offsetof的模拟实现 :

#include <stddef.h>
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
struct Stu
{int a;//0~3char c;//4//5~7double d;//8~15
};#define OFFSETOF(struct_type, mem_name)      (int)&(((struct_type*)0)->mem_name)int main()
{printf("%d\n", OFFSETOF(struct Stu, a));printf("%d\n", OFFSETOF(struct Stu, c));printf("%d\n", OFFSETOF(struct Stu, d));return 0;
}

实现详解 :

我们假设结构体起始地址就是0,这样其成员的地址取出来再强制类型转换为int便可以表示结构体中某个成员相对于起始位置的偏移量,这是一种很巧妙的思考方式,即可实现宏 offsetof 的模拟实现;

【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)相关推荐

  1. C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移

    C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...

  2. C语言 泛型链表 如何计算(结构体中各元素)相对内存地址?(字节对齐,结构体对齐)offsetof()函数 ( (struct X*)0 ) -> Y)语法(匿名结构体)

    示例: typedef struct _user {char name[20];char sex[20];int age;struct list_head mylist;//自定义结构体里保存双向循环 ...

  3. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  4. C语言的sizeof运算符计算结构体大小

    C语言的sizeof运算符运算规则 sizeof运算符 **sizeof 是一个运算符,不是函数(方法).** 例子: 当想打印一个变量的存储区域大小时,可以直接写 int a = 5; printf ...

  5. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)

    获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...

  6. python中的记录指针_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  7. libev中ev_loop结构体中宏定义的理解

    libev源代码由于有各种宏定义,十分让人费解,作者这么写确实使得代码很简练,但也给读者的阅读带来了巨大的麻烦,下面将分析下ev_loop这个结构体的定义,加深对作者代码简化的理解,先上代码: str ...

  8. C语言 计算结构体大小

    本文主要参考:结构体内存对齐(如何计算结构体的大小) 前言 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数. 结构体中的成员可以是不同的数据类型, ...

  9. 通过宏函数计算结构体成员偏移量

      编译器在为结构体成员分配内存时,由于存在内存对齐机制,各个成员所占空间可能不是连续的,因而不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址.   获得结构体成员偏移量的方法可以参照 ...

最新文章

  1. Github标星3K+,超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M
  2. 解决linux服务器掉包问题
  3. html上传文件与后台处理,关于前端html图片和文件上传和后台接收方法
  4. react router路径的匹配原则
  5. powertoys中文版
  6. Oracle 11g服务器与客户端卸载、安装
  7. hadoop2.7 伪分布
  8. Zigbee网络架构+ZigBee的体系结构+理解zigbee节点的实现的案例+“51单片机” 和 “zigbee” 、 “cc2530芯片” 之间的关系+芯片cc2530
  9. cookie工作流程
  10. java解析tcp报文_JAVA语言TCP通信和JDBC示例(AIS信息解析)
  11. 拼接字符串时的引号嵌套
  12. MySQL 中随机抽样:order by rand limit 的替代方案
  13. HTML和XHTML解析(HTMLParser、BeautifulSoup)
  14. matlab设计滤波器
  15. 蓝牙音乐之AVRCP
  16. Groovy 教程系列(一)-- Groovy 入门
  17. oracle清空回收站指定表,oracle 删除表结构及清空回收站
  18. svchost.exe“病毒”
  19. CSS改变table内置tbody滚动条
  20. Comsumer的一些解释

热门文章

  1. Python设计模式-桥接模式
  2. Linux系统中创建虚拟环境详解
  3. Celery 应用:Application
  4. 懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  5. 智能制造-逆向工程-三维测量-标定
  6. PyTorch中模型的可复现性
  7. BCH专属“谷歌地图”凸显BCH魅力
  8. nodejs-7. mongoDB数据库
  9. 开源一个天气APP Build with React Native
  10. 在为时已晚前 阻止物联网安全威胁和攻击