首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解container_of

理解container_of
EN

Stack Overflow用户
提问于 2014-10-20 23:54:05
回答 1查看 844关注 0票数 1

我试图通过编写一个小程序来理解container_of宏,但是我没有得到预期的结果。我写的程序是:

代码语言:javascript
复制
typedef struct node {
    int id1;
    int id2;
    struct node *next;
}node;

int main()
{
    node *n1, *n2;
    n1 = malloc(sizeof(node));
    n2 = malloc(sizeof(node));

    n1->id1 = 101;
    n1->id2 = 102;
    n1->next = n2;

    n2->id1 = 201;
    n2->id2 = 202;
    n2->next = NULL;

    node *obj = (node*)container_of(&n2, node, next);

    printf("%d\n", obj->id1);
    free(n1);
    free(n2);

    return 0;
 }

但是有了这个密码,我得到了一些随机数作为我的答案。有什么我可能会错的想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-20 23:57:44

container_of是一个流行的实用工具宏,但它不是该语言的标准特性。

container_of的第一个参数应该直接指向结构字段,即直接指向更大对象的嵌套子对象。更大的对象是宏的名称所指的“容器”。

您正在传递&n2 --一个指向完全独立局部变量的指针。这就是它不起作用的原因。n2是一个自变量。它不是任何容器的一部分。

正确使用container_of的一个例子是

代码语言:javascript
复制
node **pnext = &n2->next;
int *pid = &n1->id1;

...
// Assume that now we want to restore `n2` knowing only `pnext`
node *obj = container_of(pnext, node, next);
assert(obj == n2);

...
// Assume that now we want to restore `n1` knowing only `pid`
obj = container_of(pid, node, id1);
assert(obj == n1);

也就是说,从指向*n2对象字段的指针中,可以得到指向整个*n2对象本身的指针。从指向*n1对象字段的指针中,可以得到指向整个*n1对象本身的指针。

我也不清楚你为什么要抛出container_of的结果。传统的container_of实现已经返回一个正确转换的指针。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26476788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档