阅读量:0
container_of
宏是一个用于在 Linux 内核中获取容器结构体指针的实用宏
以下是一个简单的示例,说明如何使用 container_of
宏解决链表问题:
#include<stdio.h> #include <stdlib.h> // 定义一个链表节点结构体 typedef struct list_node { int data; struct list_node *next; } ListNode; // 定义一个包含链表节点的容器结构体 typedef struct container { int id; ListNode node; } Container; // 创建一个新的容器并初始化其链表节点 Container *create_container(int id, int data) { Container *container = (Container *)malloc(sizeof(Container)); container->id = id; container->node.data = data; container->node.next = NULL; return container; } // 使用 container_of 宏获取容器结构体指针 Container *get_container_from_node(ListNode *node) { return container_of(node, Container, node); } int main() { // 创建两个容器并初始化其链表节点 Container *container1 = create_container(1, 10); Container *container2 = create_container(2, 20); // 将两个容器的链表节点连接起来 container1->node.next = &container2->node; // 通过链表节点获取容器结构体指针 Container *found_container = get_container_from_node(container1->node.next); // 输出找到的容器的 ID 和数据 printf("Found container with ID: %d and data: %d\n", found_container->id, found_container->node.data); // 释放分配的内存 free(container1); free(container2); return 0; }
在这个示例中,我们定义了一个链表节点结构体 ListNode
和一个包含链表节点的容器结构体 Container
。我们创建了两个容器并将它们的链表节点连接起来。然后,我们使用 container_of
宏从链表节点获取容器结构体指针,并输出找到的容器的 ID 和数据。