佚名通过本文主要向大家介绍了这句话,这句话让我感动,这句话启发了我,鲁迅我没说过这句话,这句话影响了我作文等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:define宏定义的这句话是什么意思呢?
描述:
解决方案1:
描述:
在一本书上看到了这段代码,其含义是求一个结构体成员相对于结构体开始位置的偏移量,但不理解其含义,求大牛解释.
struct{
int a;
double b[20];
double c;
}struc;
#define FIND(struc,c) ((size_t)&((struc *)0)->e)
解决方案1:
struct
结构体对象的内存位置是连续的,假设整个对象的起始地址是0
,(struc *)0
这里做了强制转换;那么我们首先解引用取得结构体某个元素的值
struc* p = (struc *)0;
double c = p->c;
然后再获得元素的地址,这个地址就是相对于整个结构体对象内存的起始位置的
size_t offset =(size_t)( &c - (size_t)0);
题主你看的是扫描版的么?
解决方案2:这个宏应该是参考linux
的offsetof
宏定义:#define offsetof(TYPE, MEMBER) (size_t)(&(((TYPE*)0)->MEMBER))
这个宏的分析:
(TYPE*)0
将0
地址强转为TYPE
类型的指针
((TYPE*)0)->MEMBER
获取TYPE
结构体中的成员MEMBER
&(((TYPE*)0)->MEMBER)
获取成员MEMBER
的地址, 通常我们拿这个地址值减去整个结构体的起始地址即可得出MEMBER
的偏移地址, 但因为现在结构体的起始地址为0
(这个0
就是整个宏定义的精华所在), 所以获取的地址即为实际的偏移地址(减去0
等于没减嘛)