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 和数据。