IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

根据成员地址获取结构体变量

记录&分享 2011-01-10 23:32:49 累计浏览 2,642 次
本机暂存

其实是对于offsetof函数的灵活应用,关于offsetof函数:

#define offsetof(s, m)   (size_t)&(((s *)0)->m)

s是一个结构名,它有一个名为m的成员(s和m 是宏offsetof的形参,它实际是返回结构s的成员m的偏移地址.
(s *)0 是骗编译器说有一个指向类(或结构)s的指针,其地址值0
&((s *)0)->m 是要取得类s中成员变量m的地址. 因基址为0,这时m的地址当然就是m在s中的偏移
最后转换size_t 型,即unsigned int。

因此,我们可以根据成员地址来获取结构体变量,如下所示:

typedef struct mv_s  mv_t;
 
struct mv_s {
      mv_t *t;
      char *name;
      int age;
};
 
//something else
mv_t *mv, *mvt, *mvtt;
mv->t = ....;
mv->name = ...;
mv->age = ...;
 
mvtt = mv->t;
mvt = (mv_t *) ((u_char *) mvtt - offsetof(mv_t, t))
 
//now, mvt == mv
printf("%d\n", mvt->age);

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 如何学好C++语言 (累计阅读 10,448)
  2. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,411)
  3. colortail,让 tail 命令绚丽起来 (累计阅读 10,258)
  4. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,497)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,443)
  6. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,875)
  7. 浅析C++多线程内存模型 (累计阅读 8,802)
  8. C++ 多线程编程总结 (累计阅读 8,097)
  9. 使用gdb调试运行时的程序小技巧 (累计阅读 7,206)
  10. 在C++里写一个不能被继承的类 (累计阅读 6,580)