温馨提示×

用container_of宏解决链表问题

小樊
83
2024-09-02 19:44:59
栏目: 编程语言

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

0