container_of宏
在 C 语言中,container_of
是一个宏定义,可以通过指向结构体中的成员来获取该结构体的地址。它的定义如下:
#define container_of(ptr, type, member) \ ((type *)((char *)(ptr) - offsetof(type, member)))
其中,ptr
是指向结构体中某个成员的指针,type
是结构体类型,member
是结构体中的成员名。
使用 container_of
宏时,需要注意以下几点:
- 确保
ptr
指针是有效的,并且指向的是结构体中的成员。 - 确保
member
成员在结构体中的偏移量是已知的,可以使用offsetof
宏来获取。 - 确保
type
是正确的结构体类型,否则可能会导致未定义的行为和内存错误。
下面是一个示例,演示如何使用 container_of
宏:
1 #include <stddef.h> 2 #include <stdio.h> 3 4 #define container_of(ptr, type, member) \ 5 ((type *)((char *)(ptr) - offsetof(type, member))) 6 7 struct person { 8 char name[20]; 9 int age; 10 }; 11 12 int main() { 13 struct person p = {"Alice", 25}; 14 int *age_ptr = &p.age; 15 16 // Get the address of the containing struct 17 struct person *person_ptr = 18 container_of(age_ptr, struct person, age); 19 20 // Print the name and age 21 printf("Name: %s\nAge: %d\n", person_ptr->name, person_ptr->age); 22 23 return 0; 24 }
这个例子创建了一个名为 person
的结构体,其中包含一个名为 name
的字符串和一个名为 age
的整数。然后,它创建了一个指向 age
成员的指针,并使用 container_of
宏获取包含此成员的结构体的地址。最后,它打印出该结构体中的 name
和 age
值。
それでも私の大好きな人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)