在container_of宏中有什么用char *?

时间:2015-02-14 00:32:52

标签: c

我们有container_of的链表实现,如下所示:

 #define container_of(ptr, type, member) ({
 const typeof( ((type *)0)->member ) *__mptr = (ptr); 
 (type *)( (char *)__mptr - offsetof(type,member) );
 })

有人可以解释char *的目的吗?我可以看到你正在接受一个偏移,但为什么它被转换为char *而不是实际类型呢?

1 个答案:

答案 0 :(得分:4)

当你在C中添加和减去指针时,它是在指向的类型大小的单位中完成的。所以,例如,如果

int s[10];

如果s指向int,则s+1指向下一个int,而不是下一个字节。同样,如果你从另一个指针中减去一个指针,你可以根据它们的类型得到它们之间的距离,而不是字节。

因此offsetof将指针强制转换为char *,以便它始终以字节为单位返回偏移量。