container_of是Linux內核中的一個宏定義,用于根據結構體中的某個成員變量的地址,找到該結構體的起始地址。
宏的定義如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
宏的參數解釋:
ptr
:指向某個結構體成員變量的指針。type
:結構體的類型。member
:結構體中成員變量的名稱。該宏實際上是通過將指向成員變量的指針轉換為結構體指針,來實現找到結構體起始地址的目的。它的實現思路是:
舉個例子來說明,假設有如下定義的結構體和變量:
struct example_struct {
int a;
int b;
int c;
};
struct example_struct example;
int *ptr = &(example.b);
可以使用container_of宏來找到結構體example的起始地址,示例如下:
struct example_struct *p = container_of(ptr, struct example_struct, b);
printf("%p\n", p); // 輸出結構體example的起始地址
總結來說,container_of宏是Linux內核中一個十分有用的宏定義,可以根據結構體中的成員變量的地址快速找到結構體的起始地址,進而方便地進行操作。在內核中,它常常被用于實現類似鏈表、隊列等數據結構的遍歷和操作。