CONTAINING_RECORD宏的实现原理
来源:互联网 发布:国外聊天软件app 编辑:程序博客网 时间:2024/05/22 00:09
在使用windows完成端口时,会使用到CONTAINING_RECORD
宏,该宏的作用就是:根据结构体中的某成员的地址来推算出该结构体整体的地址,相当于一个万能公式。
下面代码的注释中,讲解了该宏的实现原理。
#include <Windows.h>#include <stdio.h>int main(){ struct T { int a; int b; int c; }; //CONTAINING_RECORD宏的作用就是根据结构体中的某成员的地址来推算出该结构体整体的地址。 T t = { 1, 2, 3 }; //假设我们知道T结构体中b的地址和名称,求t的指针 T *pT = CONTAINING_RECORD(&t.b, T, b); printf("a:%d b:%d c:%d\n", pT->a, pT->b, pT->c); //CONTAINING_RECORD的定义: //((type *)( (PCHAR)(address) - (ULONG_PTR)(&((type *)0)->field))) //最后一部分(&((type *)0)->field) 将0(空指针)转成type,再取地址。 //在本例中就是将空指针转成T*, 然后指向b这个变量, 然后再取地址。 //这个操作的作用就是:假设T开始在0x000000内存位置上分配内存,在此基础上求b的内存地址, //这样等同于求得b的内存结构体对齐偏移量, 求得b的地址我们转成ULONG_PTR类型, //然后用实际b的内存地址减去b的结构体偏移量求得结构体首地址。 // //分解开来就是: //这种情况是允许的。 //这个大前提很重要!!! T *pTemp = (T*)0; //求b的内存地址,在结构体首地址为0的情况下b的内存地址其实就是自身的对齐大小偏移量!!! //CONTAINING_RECORD宏的核心!!! int *pB = &pTemp->b; ULONG_PTR Offset = (ULONG_PTR)pB; //转成数字, 就是b的偏移量。 printf("b的偏移量:%d\n", Offset); //因为各个成员的地址是递增的,最后用实际b的地址减b的偏移量的到结构体首地址 T *pFinal = (T*)(((char*)&t.b) - Offset); printf("T中a:%d b:%d c:%d\n", pFinal->a, pFinal->b, pFinal->c); return 0;}
参考:
https://blog.twofei.com/546/
http://blog.csdn.net/f_r_e_e_x/article/details/49274299
阅读全文
1 0
- CONTAINING_RECORD宏的实现原理
- CONTAINING_RECORD宏的作用
- 嵌套的 CONTAINING_RECORD 宏
- CONTAINING_RECORD宏的含义
- 嵌套的 CONTAINING_RECORD 宏
- 宏CONTAINING_RECORD的计算解析
- CONTAINING_RECORD宏的详细解释
- CONTAINING_RECORD宏的详细解释
- CONTAINING_RECORD宏
- CONTAINING_RECORD宏
- CONTAINING_RECORD 宏
- 宏CONTAINING_RECORD
- CONTAINING_RECORD 宏
- Windows 经典的宏——CONTAINING_RECORD
- CONTAINING_RECORD宏的详细解释(转)
- 我对CONTAINING_RECORD宏的详细解释
- 我对CONTAINING_RECORD宏的详细解释
- 我对CONTAINING_RECORD宏的详细解释
- VC的血与泪,最难尽调的是人性————失败风投案例分析
- 合并有序数组
- 渗透网站搜寻
- 软件调试笔记66
- Android研究_Gralloc_1概述及库加载
- CONTAINING_RECORD宏的实现原理
- Udacity机器学习(进阶)P3用到的函数笔记
- 移动端android/ios低版本不兼容position:fixed属性
- IOC容器的依赖注入
- mysql常用命令-密码设置
- Java设计模式百例
- java练习题13
- Android Studio类注释 方法注释
- iOS 创建Framework