宏偏移量问题

云斜月 2015-06-02 09:39:07
1.	/**
2. * container_of - 通过结构体的一个成员获取容器结构体的指针
3. * @ptr: 指向成员的指针。
4. * @type: 成员所嵌入的容器结构体类型。
5. * @member: 结构体中的成员名。
6. *
7. */
8. #define container_of(ptr, type, member) ({ \
9. const typeof( ((type *)0)->member ) *__mptr = (ptr); \
10. (type *)( (char *)__mptr - offsetof(type,member) );})


在这个宏中, 这个地方(char *)__mptr - offsetof(type,member) )
为什么要把__mptr 先转换为char*类型在进行计算偏移
...全文
154 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
云斜月 2015-06-02
  • 打赏
  • 举报
回复
引用 1 楼 jiqiang01234 的回复:
char*保证是以单字节计算偏移量的,因指针如果直接进行减法运算,是和类型相关的
谢谢
mymtom 2015-06-02
  • 打赏
  • 举报
回复
指针的偏移量是按照对象个数计算的。 When an expression that has integral type is added to or subtracted from a pointer, the integral value is first multiplied by the size of the object pointed to. 这里是需要按字节计算的,所以转换为char *
mewiteor 2015-06-02
  • 打赏
  • 举报
回复
C/C++在对指针进行加减时会自动将偏移量乘上指针指向的数据类型的大小,比如定义一个int *p;那么,p+i的地址实际上为 p+i*sizeof(int);而如果将p转换成char*,(char*)p+i的地址为(char*)p+i*sizeof(char), sizeof(char)为1, 所以结果为 (char*)p+i. 这里offsetof的结果为实际的偏移量,不应该再去乘上类型大小,所以就通过将__mptr转换为char*来实现这一目的.
jiqiang01234 2015-06-02
  • 打赏
  • 举报
回复
char*保证是以单字节计算偏移量的,因指针如果直接进行减法运算,是和类型相关的

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧