container_of
宏在 C 語言中通常用于獲取結構體的起始地址,給定其成員變量的指針
這個宏的主要作用是在遍歷鏈表、樹等數據結構時,根據某個成員變量的指針回溯到其所屬的結構體。例如,在遍歷一個雙向鏈表時,我們可以使用 container_of
宏從鏈表節點的指針獲取到包含該節點的結構體實例。
下面是一個簡單的示例:
#include<stdio.h>
#include <stddef.h>
typedef struct {
int data;
struct list_head list;
} my_data_t;
// 假設已經定義了 list_head 結構體和相關操作函數
int main() {
my_data_t node1 = { .data = 1 };
my_data_t node2 = { .data = 2 };
// 假設已經將 node1 和 node2 添加到鏈表中
struct list_head *cur;
// 遍歷鏈表
list_for_each(cur, &head) {
// 使用 container_of 宏獲取 my_data_t 結構體實例的指針
my_data_t *entry = container_of(cur, my_data_t, list);
printf("Data: %d\n", entry->data);
}
return 0;
}
在這個示例中,我們使用 container_of
宏從鏈表節點的指針獲取到包含該節點的 my_data_t
結構體實例。這樣我們就可以訪問和操作結構體中的其他成員變量。