container_of
是一個 C 語言宏,用于在已知成員變量的情況下獲取其所屬結構體的指針
#include<stdio.h>
#include <stddef.h>
typedef struct {
int id;
char name[20];
} Student;
offsetof
計算成員變量在結構體中的偏移量。例如,計算 name
成員在 Student
結構體中的偏移量:size_t name_offset = offsetof(Student, name);
printf("Offset of 'name' in Student: %zu\n", name_offset);
container_of
宏的行為。例如:void* test_container_of(void* ptr, size_t offset) {
return (char*)ptr - offset;
}
Student
結構體實例,并獲取其 name
成員的地址。然后使用測試函數獲取結構體實例的地址,并檢查結果是否正確。例如:int main() {
Student student = {1, "Alice"};
void* name_ptr = &student.name;
// 使用測試函數獲取結構體實例的地址
Student* container_ptr = (Student*)test_container_of(name_ptr, name_offset);
// 檢查結果是否正確
if (container_ptr == &student) {
printf("Test passed!\n");
} else {
printf("Test failed!\n");
}
return 0;
}
container_of
宏的行為與預期相符。注意:這個示例僅用于演示目的,實際上您應該直接使用編譯器提供的 container_of
宏。在編寫驅動程序或其他需要直接操作硬件的代碼時,這種方法可能會很有用。