请教关于container_of和LIST_HEAD_INIT的问题

发布于 2022-07-24 01:44:36 字数 1227 浏览 12 评论 1

这个宏定义:
#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情独悲 2022-07-27 13:46:11

>为什么要把_mptr 转换成char类型的指针啊?
这是因为__mptr - offsetof这个表达式中, offset的单位是字节, 所以把__mptr强制成char *。 试想(int *)__mptr - offset会发生什么?

>能为name分配内存空间吗?
就像int a = 10;这条语句一样,就分配a的类型所占用的大小。  本例中就分配struct list_head这么大

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文