container_of宏

  在 C 语言中,container_of 是一个宏定义,可以通过指向结构体中的成员来获取该结构体的地址。它的定义如下:

#define container_of(ptr, type, member) \
    ((type *)((char *)(ptr) - offsetof(type, member)))

  其中,ptr 是指向结构体中某个成员的指针,type 是结构体类型,member 是结构体中的成员名。

  使用 container_of 宏时,需要注意以下几点:

  1. 确保 ptr 指针是有效的,并且指向的是结构体中的成员。
  2. 确保 member 成员在结构体中的偏移量是已知的,可以使用 offsetof 宏来获取。
  3. 确保 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 宏获取包含此成员的结构体的地址。最后,它打印出该结构体中的 nameage 值。

posted @   阿玛尼迪迪  阅读(117)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示