当前位置: 技术问答>linux和unix
问一个list_entry的问题
来源: 互联网 发布时间:2016-05-22
本文导语: 我们知道 宏 list_entry定义为 #define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 其中type是对应的结构,member是这个结构中的一个成员,ptr是地址,它所指的类型和member相同。 ...
我们知道 宏 list_entry定义为
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
其中type是对应的结构,member是这个结构中的一个成员,ptr是地址,它所指的类型和member相同。
它的含义是从一个结构的成员指针找到其容器的指针。
我不明白的是为什么要 (char *)(ptr),相关的解释是用(char*)ptr是为了计算字节偏移
我的疑问是因为ptr本身就是一个指针地址,有必要把它再强制转化成char *吗?难道我不能直接相减吗?
#define list_entry(ptr, type, member)
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
其中type是对应的结构,member是这个结构中的一个成员,ptr是地址,它所指的类型和member相同。
它的含义是从一个结构的成员指针找到其容器的指针。
我不明白的是为什么要 (char *)(ptr),相关的解释是用(char*)ptr是为了计算字节偏移
我的疑问是因为ptr本身就是一个指针地址,有必要把它再强制转化成char *吗?难道我不能直接相减吗?
|
当然需要转换类型,否则ptr-1就减去了不止一个字节了
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。