经常我们在一些开源的或者内核代码中会看到。

  1. #define TYPE_STRUCT(ptr, type, member)((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
就是由结构体的成员地址获得结构体的地址。

参数:
  1. ptr :结构体的某个成员地址。
  2. type:结构体名
  3. member:该成员名
这个就是很巧妙地利用了已知结构体的地址情况下用
  1. struct_ptr -> member
利用"->"求成员的地址,其实就是

  1. 结构体首地址+偏移量
来求得成员地址。
于是我们把0地址强制转换成该结构体的地址,再用"->"来求偏移量:
  1. (unsigned long)(&((type *)0)->member))
那么反过来用成员地址 “回退” 这个偏移量就得到了结构体 变量的首地址了。

  1. ((type *)((char*)(ptr)-(unsigned long)(&((type *)0)->member)))
那么整个过程其实就是
  1. 结构体首地址=成员地址-该成员在该结构体里的偏移量

注意:
注意其中的
  1. ((type *)((char*)(ptr)
它是首强制转换成了 char* 。
其实道理大家都懂,就是强制转换了在进行指针的 加 减 运行 就是按 “字节”来的。
指针 http://www.cnblogs.com/yml435/p/4655463.html

null

转载于:https://www.cnblogs.com/yml435/p/6644776.html

结构体成员地址获得结构体起始地址相关推荐

  1. 在Golang里如何实现结构体成员指针到结构体自身指针的转换

    原文地址:http://goworldgs.com/?p=37 在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针.下面是一个例子,通过FIELD_OFF ...

  2. lru算法C语言结构体指针,在Golang里如何实现结构体成员指针到结构体自身指针的转换...

    在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针.下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的 ...

  3. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐

    文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...

  4. 结构体之引用结构体成员变量

    引用结构体成员变量 一个结构体包含一个或者多个成员变量,在实际使用中,就需要对其成员变量进行引用,对于一个已经定义了的结构体变量和一个指向该结构体的指针变量. 可以用一下三种情况引用结构体 成员变量. ...

  5. 【Linux 内核 内存管理】虚拟地址空间布局架构 ③ ( 内存描述符 mm_struct 结构体成员分析 | mmap | mm_rb | task_size | pgd | mm_users )

    文章目录 一.mm_struct 结构体成员分析 1.mmap 成员 2.mm_rb 成员 3.get_unmapped_area 函数指针 4.task_size 成员 5.pgd 成员 6.mm_ ...

  6. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

  7. 结构体struct及计算结构体大小

    目录 1.结构体类型的声明 2. 用结构体类型来创建结构体变量并初始化 3.结构体的嵌套使用​ 4.结构体传参 5. 结构体成员的访问 1.结构体类型的声明 结构是一些值的集合,这些值称为成员变量.结 ...

  8. 结构体引用_C/C++结构体完全攻略

    结构体是一个由程序员定义的数据类型,可以容纳许多不同的数据值.在过去,面向对象编程的应用尚未普及之前,程序员通常使用这些从逻辑上连接在一起的数据组合到一个单元中.一旦结构体类型被声明并且其数据成员被标 ...

  9. c语言 结构体 初始化,C语言结构体初始化

    C语言结构体初始化教程 在 C语言结构体初始化 语法 struct structName varName = {fileldValue1, fileldValue2, fileldValue3}; 参 ...

  10. 对C语言 结构数组 指向结构变量的指针 指向结构数组的指针

    一.结构数组的定义 数组的元素可以是结构类型的.结构数组的每一个元素都是具有相同的结构类型的下标结构变量.在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体. 如:一个班的学生的档案,一个车 ...

最新文章

  1. 超阿里、大华,澎思科技行人再识别(ReID)技术刷新三大数据集记录
  2. 利用commons-fileupload 上传图片(包含表单数据)
  3. 基于BASYS2的VHDL程序——交通灯(状态机版)
  4. 查看手机截图的坐标信息
  5. 学Java可以看哪些书?6本Java书籍推荐
  6. STM32f103 —— timer
  7. 使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较、同步...
  8. LeetCode刷题(34)-Rotate List
  9. Apache常见配置及问题
  10. 熊猫烧香delphi编写免费源代码
  11. Amesim学习——传热基础案例:烧红铁棒在空气中冷却
  12. pyqt+pyqtgraph+lka(界面制作)--优化版
  13. c语言oj1065统计,东方博宜OJ
  14. .net core 下文件压缩打包下载
  15. Flutter 项目实战 截图分享到微信|QQ|微博 十二
  16. RabbitMQ, Kafka和Pulsar (一)
  17. 计算机编程那个好学点,计算机编程好学吗?
  18. Excel打印时完整显示合并的单元格区域
  19. Linux MMC原理及框架详解
  20. SAP 公司间销售配置原理和步骤

热门文章

  1. WEUI picker组件无法js动态改变选项
  2. CTFshow php特性 web103
  3. 第九周项目实践1 二叉树的链式存储及基本运算 算法库
  4. Python进阶01 词典
  5. 查看Mat对象的数据的三种方法
  6. 数字录音系统服务器,Internet呼叫中心坐席全程录音系统录音模块
  7. 猫狗识别——PyTorch
  8. java内存中的栈、方法区 、堆
  9. Django整理(二) - 视图和模板的初步使用
  10. JavaScript 学习中的帮助记忆(日积月累)