我试图通过编写一个小程序来理解container_of宏,但是我没有得到预期的结果。我写的程序是:
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;
}但是有了这个密码,我得到了一些随机数作为我的答案。有什么我可能会错的想法吗?
发布于 2014-10-20 23:57:44
container_of是一个流行的实用工具宏,但它不是该语言的标准特性。
container_of的第一个参数应该直接指向结构字段,即直接指向更大对象的嵌套子对象。更大的对象是宏的名称所指的“容器”。
您正在传递&n2 --一个指向完全独立局部变量的指针。这就是它不起作用的原因。n2是一个自变量。它不是任何容器的一部分。
正确使用container_of的一个例子是
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实现已经返回一个正确转换的指针。
https://stackoverflow.com/questions/26476788
复制相似问题