define宏定义的这句话是什么意思呢?

在一本书上看到了这段代码,其含义是求一个结构体成员相对于结构体开始位置的偏移量,但不理解其含义,求大牛解释.

struct{
    int a;
    double b[20];
    double c;
}struc;

#define FIND(struc,c) ((size_t)&((struc *)0)->e)
阅读 4.4k
2 个回答

这个宏应该是参考linuxoffsetof宏定义:
#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))

这个宏的分析:

(TYPE*)00地址强转为TYPE类型的指针

((TYPE*)0)->MEMBER 获取TYPE结构体中的成员MEMBER

&(((TYPE*)0)->MEMBER) 获取成员MEMBER的地址, 通常我们拿这个地址值减去整个结构体的起始地址即可得出MEMBER的偏移地址, 但因为现在结构体的起始地址0(这个0就是整个宏定义的精华所在), 所以获取的地址即为实际的偏移地址(减去0等于没减嘛)

struct结构体对象的内存位置是连续的,假设整个对象的起始地址是0(struc *)0这里做了强制转换;那么我们首先解引用取得结构体某个元素的值

struc* p = (struc *)0;
double c = p->c;

然后再获得元素的地址,这个地址就是相对于整个结构体对象内存的起始位置的

size_t offset =(size_t)( &c - (size_t)0);

题主你看的是扫描版的么?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题