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 和數據。