我们有container_of的链表实现,如下所示:
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );
})
有人可以解释char *的目的吗?我可以看到你正在接受一个偏移,但为什么它被转换为char *而不是实际类型呢?
答案 0 :(得分:4)
当你在C中添加和减去指针时,它是在指向的类型大小的单位中完成的。所以,例如,如果
int s[10];
如果s
指向int
,则s+1
指向下一个int
,而不是下一个字节。同样,如果你从另一个指针中减去一个指针,你可以根据它们的类型得到它们之间的距离,而不是字节。
因此offsetof
将指针强制转换为char *
,以便它始终以字节为单位返回偏移量。