请教关于container_of和LIST_HEAD_INIT的问题
这个宏定义:
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
最后一行:
(type *)( (char *)__mptr - offsetof(type,member) );})
为什么要把_mptr 转换成char类型的指针啊?
struct list_head {
struct list_head *next, *prev;
};
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name)
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
如果使用这两个宏定义
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name)
struct list_head name = LIST_HEAD_INIT(name)
能为name分配内存空间吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
>为什么要把_mptr 转换成char类型的指针啊?
这是因为__mptr - offsetof这个表达式中, offset的单位是字节, 所以把__mptr强制成char *。 试想(int *)__mptr - offset会发生什么?
>能为name分配内存空间吗?
就像int a = 10;这条语句一样,就分配a的类型所占用的大小。 本例中就分配struct list_head这么大