+ -
当前位置:首页 → 问答吧 → offsetof 问题(转)

offsetof 问题(转)

时间:2010-07-10

来源:互联网

机器是32位Intel的架构, 在vs2008下测试

我定义了一个结构体

typedef int ElemType;

typedef struct Element  

{

        struct Element *next;

        ElemType data;

} Element;

然后动态分配了一块内存

Element* head = (Element*) malloc(sizeof(Element));

之后查看各部分的地址

printf("%p:%p %p\n", head, head + offsetof(Element, data), &head->data);

结果是

00271DF8:00271E18  00271DFC

我开始时认为后两个相等,后来觉得head + offsetof(Element, data)应该是head加上o
ffset乘上sizeof(Element), 结果也不对.

head + offsetof(Element, data)与head之间相差的是0x20个字节, 为什么啊? 后两者不是要相等的么?

各位能不能解释一下?

作者: keneth2078   发布时间: 2010-07-10

data的偏移是4个字节.
所以head+offsetof(Element ,data) 就是是head+4。
由于head 是指向Elment的指针,而sizeof(Element)是8个字节.
所以head + 4 编译成翻译为 (char *)head + 4*sizeof(Elment),所以是差了0x20 =32个字节。
你写成(char *)head + offsizeof(Elment ,data)试试。

指针的加减法,在多理解理解。

作者: star1983653   发布时间: 2010-07-10

回复 star1983653


  试了一下,真是你所说的那样。

想不到的是 head+offsetof(Element,data)中,offsetof(Element,data)要乘以sizeof(struct(Element)) ...

作者: keneth2078   发布时间: 2010-07-10

看一下大家的发言,进来顺便问好!

作者: suavelee   发布时间: 2010-07-10