当前位置: 首页 > news >正文

c语言练习66:模拟实现offsetof

模拟实现offsetof

#define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName)

StructType是结构体类型名,MemberName是成员名。具体操作方法是:

1、先将0转换为一个结构体类型的指针,相当于某个结构体的首地址是0。此时,每一个成员的偏移量就成了相对0的偏移量,这样就不需要减去首地址了。

2、对该指针用->访问其成员,并取出地址,由于结构体起始地址为0,此时成员偏移量直接相当于对0的偏移量,所以得到的值直接就是对首地址的偏移量。

3、取出该成员的地址,强转成size_t并打印,就求出了这个偏移量。

代码:

#include<stdio.h>
#include <stddef.h> 
struct S {char c1;int i;char c2;
};
#define OFFSETOF(type,mem) (size_t)&(((type*)0)->mem)  //将0转化为结构题指针(type*)0
int main() {                                   //通过结构体指针找到结构体对象后取出其地址printf("%d\n", OFFSETOF(struct S, c1));printf("%d\n", OFFSETOF(struct S, i));printf("%d\n", OFFSETOF(struct S, c2));return 0;
}

结果:

http://www.lryc.cn/news/176385.html

相关文章:

  • 数据库缓存服务器集群 redis集群
  • [密码学入门]仿射密码(Affine)
  • 【Maven】SpringBoot多模块项目利用reversion占位符,进行版本管理.打包时版本号不能识别问题
  • Vue watch实时计算器
  • Java中的super关键字
  • MySQL数据库入门到精通6--进阶篇(锁)
  • js的继承
  • HONEYWELLL 05701-A-0325 控制脉冲模块
  • Qt扩展-QCustomPlot 简介及配置
  • python教程:selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()
  • 从裸机开始安装操作系统
  • redhat 6.1 测试环境安装 yum
  • WARNING:tensorflow:Your input ran out of data; interrupting training. 解决方法
  • ChunJun(OldNameIsFlinkX)
  • MySQL的时间差函数、日期转换计算函数
  • 【神印王座】悲啸洞穴之物揭晓,圣采儿差点被骗,幸好龙皓晨聪明
  • 性能测试之使用Jemeter对HTTP接口压测
  • Spring面试题13:Spring中ApplicationContext实现有哪些?Bean工厂和Applicationcontext有什么区别
  • Spring 学习(六)代理模式
  • Educational Codeforces Round 155 (Rated for Div. 2) - D Sum of XOR Functions
  • [C++ 网络协议] I/O流分离所带来的半关闭问题
  • 根据文章段落内容自动插入图片php版
  • 在GEHC的第一个sprint记录
  • MFC 绘图
  • 算法 用两个栈实现队列-(栈+队列)
  • Android单编模块报FAILED: ninja: unknown target ‘MODULES-IN-vendor错误解决
  • 地球的某一片红薯地中秋圆《乡村振兴战略下传统村落文化旅游设计》——旅行季许少辉八月新书辉少许想象和世界一样宽广
  • Zookeeper-命令操作
  • eclipse 添加注释
  • Linux网络编程- 网络字节顺序