container_of用法及实现

container_of是一个在C语言中常用的宏,用于根据结构体成员的指针来获取到整个结构体的指针。在操作系统的内核或者底层驱动中经常使用container_of宏来处理不同数据结构之间的转换。

container_of的形式是这样的:

```

#define container_of(ptr, type, member) \

((type *)((char *)(ptr) - offsetof(type, member)))

```

其中,ptr是结构体成员的指针,type是结构体的类型,member是结构体中的成员名。

具体来说,container_of宏的思想是利用结构体成员在结构体中的偏移量来计算出结构体的起始地址。在C语言中,结构体中的成员是按照定义顺序依次存储的,因此可以通过知道成员的地址和偏移量,来计算结构体的地址。

首先,通过offsetof宏来计算出结构体成员在结构体中的偏移量。offsetof宏的定义如下:

```

#define offsetof(type, member) ((size_t) &((type *)0)->member)

```

其中,&(type *)0表示一个空指针,member是成员名。通过对该表达式求值,可以得到结构体成员在结构体中的偏移量。

然后,利用得到的偏移量,通过指针的减法操作来计算结构体的起始地址。通过(char *)的转换,可以保证指针运算的单位是字节而非结构体类型。

最后,利用强制类型转换将起始地址转换为结构体指针类型,并返回。

下面是一个使用container_of宏的示例:

```c

#include

struct example {

int a;

int b;

int c;

};

void print_example(struct example *ptr) {

printf("a: %d, b: %d, c: %d\n", ptr->a, ptr->b, ptr->c);

}

int main() {

struct example example_instance;

example_instance.a = 1;

example_instance.b = 2;

example_instance.c = 3;

int *ptr = &(example_instance.b);

struct example *example_ptr = container_of(ptr, struct example, b);

print_example(example_ptr);

return 0;

}

```

在这个例子中,我们创建了一个example结构体的实例example_instance,并给其中的成员a、b和c赋值。然后,我们取得了example_instance中成员b的地址ptr,并用container_of宏来获取整个结构体的指针example_ptr。最后,我们调用print_example函数来输出example_ptr所指向的结构体的值。

通过运行以上代码,我们可以看到输出的结果为:

```

a: 1, b: 2, c: 3

```

这证明通过container_of宏,我们成功地从结构体成员的指针获取到了整个结构体的指针。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(86) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部