gpt4 book ai didi

c - 了解 container_of

转载 作者:太空宇宙 更新时间:2023-11-04 01:04:40 26 4
gpt4 key购买 nike

我试图通过编写一个小程序来理解 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;
}

但是使用该代码,我得到了一些随机数作为我的答案。有什么我可能错的想法吗?

最佳答案

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 的传统实现已经返回一个正确转换的指针。

关于c - 了解 container_of,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476788/

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