作者在 2008-07-31 14:38:07 发布以下内容
如何根据数据结构中的某个数据的地址来获取这个整个结构的地址是多少?
比如有这样的一个结构体:struct test{ int array[100];int k;};
在程序中有一个test的对象TestObject,现在知道这个对象里的k的地址为pK,
如果去获取这个TestObject的地址呢?可能很简单:pK - 100*sizeof(int),
正确,那假如这个test结构体究竟是怎么样子的你根本不知道,那也就不知道
在k前面有什么数据,那又如何求呢?甚至很多情况下还要考虑内存对齐,那怎么办呢?
比如有这样的一个结构体:struct test{ int array[100];int k;};
在程序中有一个test的对象TestObject,现在知道这个对象里的k的地址为pK,
如果去获取这个TestObject的地址呢?可能很简单:pK - 100*sizeof(int),
正确,那假如这个test结构体究竟是怎么样子的你根本不知道,那也就不知道
在k前面有什么数据,那又如何求呢?甚至很多情况下还要考虑内存对齐,那怎么办呢?
其实道理是一样的,肯定是用k的地址pK来
减去k在这个结构中的地址偏移,这里可以借助NULL来求偏移地址:&(((test*)NULL)->k),
哎,其实vs中本来就有定义宏
PCHAR CONTAINING_RECORD(
PCHAR Address ,
TYPE Type ,
PCHAR Field ;
来实现这个功能了,不过我也是才知道。 以下来自MSDN
Parameters
Address
Pointer to a field in an instance of a structure of typeType .
Type
The name of the type of the structure whose base address is to be returned, for example, type IRP.
Field
The name of the field pointed to byAddress contained in a structure of type Type .
Return Values
Returns a pointer to the base of the structure containingField .
这个宏在winnt.h中是这样被定义的
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))
减去k在这个结构中的地址偏移,这里可以借助NULL来求偏移地址:&(((test*)NULL)->k),
哎,其实vs中本来就有定义宏
来实现这个功能了,不过我也是才知道。 以下来自MSDN
Pointer to a field in an instance of a structure of type
The name of the type of the structure whose base address is to be returned, for example, type IRP.
The name of the field pointed to by
Returns a pointer to the base of the structure containing
这个宏在winnt.h中是这样被定义的
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(ULONG_PTR)(&((type *)0)->field)))