C/C++技巧
+ -

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种方法

  1. 使用工具windbg 的 dt命令
    输入命令

    dt _MY_STRUCT
    

    则windbg自动会输出相关的偏移信息。

  2. 第二种方法是我们编程计算,使用取地址&来自动获取。
    代码如下:

// 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开始的,则获取到的成员变量地址就是成员变量相对于结构体的偏移地址。

0 篇笔记 写笔记

Windows x64 URB结构体成员偏移地址
URB4: kd> dt _URBUsbzhVCamera!_URB +0x000 UrbHeader : _URB_HEADER +0x000 UrbSelectInterface : _URB_SELECT_INTERFACE +0x000 UrbSele......
Windows x64 IRP结构体成员偏移地址
4: kd> dt _IRPntdll!_IRP +0x000 Type : Int2B +0x002 Size : Uint2B +0x004 AllocationProcessorNumber : Uint2B +0......
C/C++技巧 结构体/类成员偏移
如有以下结构体,我们怎么知道这个结构体各个成员变量abc相对于本结构体的偏移地址呢?typedef struct _MY_STRUCT{ char a; int b; float c;}MY_STRUCT, *PMY_STRUCT;当然有人说了,这是是很简单吗?我们可......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!