gpt4 book ai didi

c - 为什么在指针算术之前要强制转换为 (char *)? (container_of() 内部结构)

转载 作者:太空宇宙 更新时间:2023-11-04 08:17:05 24 4
gpt4 key购买 nike

宏定义为

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

我已经查看了这里的其他一些问题和互联网上的其他一些资源,我很确定我理解这个宏是如何工作的。

我认为它的作用:在第一行中,它创建了一个新指针,其类型为指向成员类型的指针,并将给定指针的值分配给该指针。然后在第二行它使用 offsetof 找到结构或 union 的开头地址。

我的问题是为什么这行 const typeof( ((type *)0)->member ) *__mptr = (ptr); 在这里。似乎设置了正确的指针类型,然后立即转换为下一行中的 char *

所以我的问题是为什么 __mptr 必须强制转换为不同类型的指针?为什么不能将它保留为我刚刚将其设置为的任何类型,然后从该指针中减去偏移量,因为无论如何我都会在减法之后再次转换它。此外,虽然我(认为)我明白第一行在做什么,但我不明白为什么它是必要的。

为什么这样做比这样做更好:

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

或者这个

 #define container_of(ptr, type, member) ({                      \
(type *)( (char *)ptr - offsetof(type,member) );})

最佳答案

因为减法会错误地将偏移量乘以 ptr 的大小。

也就是说,如果没有它,您将得到以下结果:

(type *)( (char *)__mptr - sizeof *__mptr * offsetof(type,member) );})

关于c - 为什么在指针算术之前要强制转换为 (char *)? (container_of() 内部结构),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35213774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com