关于取得结构体成员变量偏移量的获取!

zw_2046 2006-11-28 12:00:14
大家都知道结构体成员的变量可以通过下面的宏得到:
#define OFFSET(structure, member) ((int) &((structure *)0)->member)

我对那个“0”的来龙去脉还不清楚,盼高人指点!最好能把这个“0”从创建之初到后面的类型也作个说明。

另外还有一种是:
offset = (unsigned long)(&((MYSTRUCT *)0)->iValue2 - (unsigned long *)0;

不知道哪种方式更好一点呢?
...全文
469 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zw_2046 2006-12-01
  • 打赏
  • 举报
回复
受教了,谢谢!
zw_2046 2006-11-29
  • 打赏
  • 举报
回复
可以这样理解吗?
首先将“0”指向的地址强制认为是一个structure类型的结构体,其第一个成员的地址(也就是该结构体的起始地址)为“0”,那么取member的地址即为该成员变量的偏移量,然后将该偏移量转换为整型。

还有一个问题,“0”指向的地址通常是哪里?是堆还是栈中的呢?可能“0”所指向的内存空间存储了其他的什么数据,这样做会有危险吗?
  • 打赏
  • 举报
回复
理解正确
0是虚拟地址
只要不去访问这个地址就没事,算是利用了编译器的特点,这个东西会在编译期间计算出来。
HappyTree 2006-11-28
  • 打赏
  • 举报
回复
#define OFFSET(structure, member) ((int) &((structure *)0)->member)

0这里指的是指针0处,这样结构的第一个成员就与0对齐了,取member的地址当然就是偏移了。当然,该偏移不能直接用,需要强制转换为int。

第一种使用起来方便一些!

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧