CONTAINING_RECORD

本文深入解析了CONTAINING_RECORD宏的使用方法及其在Windows编程中的应用。通过实例演示了如何利用此宏从结构体成员的地址推算出结构体的基地址,展示了其在内存管理和数据结构操作中的实用性。
摘要由CSDN通过智能技术生成

MSDN描述:

CONTAINING_RECORD returns the base address of an instance of a structure given the type of the structure and the address of a field within the containing structure.

Syntax

PCHAR CONTAINING_RECORD(IN PCHAR Address, IN TYPE Type, 
IN PCHAR Field);

它的功能为已知结构体或类的某一成员、对象中该成员的地址和这一结构体名或类名,从而得到该对象的基地址。

其宏可以如此写:

#define CONTAINING_RECORD(address,type,field) \
((type*)((PCHAR)(address)-(ULONG_PTR)(&((type*)0)->field)))

实例:

#include <windows.h>  
#include <stdio.h>  

typedef struct
{
    int a;
    int b;
    int c;
    int d;
}DATA, *PDATA;

int main()
{
    DATA d = { 1, 2, 3, 4 };
    PDATA d2 = CONTAINING_RECORD(&d.b, DATA, b);
    printf("%d %d %d %d\n", d2->a, d2->b, d2->c, d2->d);  //Input:1 2 3 4

    int *d3 = (int*)(&((PDATA)0)->b);
    printf("%p\r\n", d3);  //Input:00000004 即b的相对地址
    ULONG_PTR Offset = (ULONG_PTR)d3;  //转成数字
    PDATA fin = (PDATA)((char*)(&d.b) - Offset);
    printf("%d %d %d %d\n", fin->a, fin->b, fin->c, fin->d);  //Input:1 2 3 4

    return 0;
}

转载于:https://www.cnblogs.com/coolcpp/p/CONTAINING_RECORD.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值