C/C++技巧 结构体/类成员偏移
2023-06-06
87
0
如有以下结构体,我们怎么知道这个结构体各个成员变量abc相对于本结构体的偏移地址呢?
typedef struct _MY_STRUCT
{
char a;
int b;
float c;
}MY_STRUCT, *PMY_STRUCT;
当然有人说了,这是是很简单吗?我们可以手动计算,如下:
第一个成员变量是个char ,占一个字节,第二个成员变量是int,占4字节,但因为系统会进行字节对齐,故b的偏移地址是4,因为a后面又补了3个字节,第三个成员是个float型,占4个节节,
故其成员结构体信息如下:
成员 | 偏移地址 | 实际占大小 | 有效大小 |
---|---|---|---|
a | 0 | 4 | 1 |
b | 4 | 4 | 4 |
c | 8 | 4 | 4 |
当然这样做是没有任何问题的,但如果这个结构体很大,而且是结构体内嵌和,那该怎么办呢?
答案是有2种方法
使用工具windbg 的 dt命令
输入命令dt _MY_STRUCT
则windbg自动会输出相关的偏移信息。
第二种方法是我们编程计算,使用取地址&来自动获取。
代码如下:
// t.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
typedef struct _MY_STRUCT
{
char a;
int b;
float c;
}MY_STRUCT, *PMY_STRUCT;
#define GetOffset(t, m) int(&(((t*)0)->m))
void main(int argc, _TCHAR* argv[])
{
int b = GetOffset(MY_STRUCT, b);
printf("%d\n", b);
}
我们定义了一个宏GetOffset,将0地址强转换成我们定义的结构体指针PMY_STRUCT,然后再用此指针获取其成员变量的地址,因数本结构体是从0开始的,则获取到的成员变量地址就是成员变量相对于结构体的偏移地址。