初始化Struct指针

Initializing Struct Pointer

本文关键字:指针 Struct 初始化      更新时间:2023-10-16

我在初始化struct指针时遇到了一些问题。

struct Hook{
    DWORD64 Address;
    vector<BYTE> OriginalBytes;
    vector<BYTE> HookBytes;
    SIZE_T length;
    bool Initialized;
};
Hook *hFuncHook;
void InitializeHookInfo(Hook* hook, DWORD64 address, SIZE_T size){
    hook = new Hook;
    hook->Address = address;
    hook->OriginalBytes = GetAOB(address, size);
    hook->HookBytes.reserve(size);
    hook->length = size;
    hook->Initialized = false;
}
void EndHookInfoInit(Hook* hook, DWORD64 address, SIZE_T size){
    printf("Hook size: %in", sizeof(hook)); //returns 8
    hook->HookBytes = GetAOB(address, size);//Crash right there
    hook->Initialized = true;
}
void InitMyHooks(){
     InitializeHookInfo(hFuncHook, mBase + 0xA100FC, 6);
     HookFunction(...);
     EndHookInfoInit(hFuncHook, mBase + 0xA100FC, 6);
}

我不明白为什么这个会崩溃。InitializeHookInfo部分不会引起任何问题,但是EndHookInfoInit会崩溃。

删除hook->HookBytes = GetAOB(...);也会导致崩溃

指针(T*)并不比一个变量更复杂,除非它包含nullptr的值,否则它的值将被视为T实例在内存中的地址。

向c++函数传递变量的默认行为是按值传递。

int f(int i) {  // i is local copy of source parameter
    i = 2;  // only modifies local copy
}

这与传递指针

没有什么不同
int f(T* p) {
    p = new T;
}

你的代码是按值获取指针:

void InitializeHookInfo(Hook* hook, DWORD64 address, SIZE_T size);

所以这行代码:

InitializeHookInfo(hFuncHook, mBase + 0xA100FC, 6);

将hFuncHook的复制到函数的第一个参数槽中,在InitializeHookInfo

void InitializeHookInfo(Hook* hook, DWORD64 address, SIZE_T size) {
    hook = new Hook;

将分配一个新的Hook,并将地址赋给一个局部变量

你应该考虑:

。从函数

返回指针
Hook* InitializeHookInfo(DWORD64 address, SIZE_T size) {
    Hook* hook = new Hook;
    // ...
    return hook;
}

b。按地址

取指针
void InitializeHookInfo(Hook** hook, DWORD64 address, SIZE_T size) {
    *hook = new Hook;

c。通过引用获取指针(由于不透明,这有点令人讨厌)

void InitializeHookInfo(Hook*& hook, DWORD64 address, SIZE_T size) {
    hook = new Hook;  // affects source parameter

或者可以考虑使用成员函数

struct Hook{
    DWORD64 Address { 0 };
    vector<BYTE> OriginalBytes;
    vector<BYTE> HookBytes;
    SIZE_T length { 0 };
    bool Initialized { false };
    Hook() {}
    Hook(DWORD64 address, SIZE_T size)
        : Address { address }
        , OriginalBytes { GetAOB(address, size) }
        , length(size)
    {
        HookBytes.reserve(size);
    }
    void EndInit(DWORD64 address, SIZE_T size)
    {
        std::cout << "Hook size: " << sizeof(*this) << "n";
        HookBytes = GetAOB(address, size);  // didn't we already do this?
        Initialized = true;
    }
};
std::unique_ptr<Hook> hFuncHook;
void InitMyHooks()
{
    hFuncHook = std::make_unique<Hook>(mBase + 0xA100FC, 6);
    HookFunction(hFuncHook.get());
    hFuncHook->EndInit(mBase + 0xA100FC, 6);
}

最后,

printf("Hook size: %in", sizeof(hook)); //returns 8

这是因为hook是一个指针,你打印的是

printf("Hook size: %in", sizeof(Hook*)); //returns 8

你可能想要

printf("Hook size: %in", sizeof(*hook)); //returns 8