初始化Struct指针
Initializing Struct Pointer
我在初始化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
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- "typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?
- sizeof(* struct 指针)是否给你结构的值
- 删除字符串指针在struct中的内存
- 如何使用struct构造函数在结构中初始化指针阵列
- 引用绑定到类型 'struct value_type' 的 null 指针
- 指向struct的指针,包含指向对象的指针,我想调用一个函数
- 如何从采用 int 和 struct 类型的指针的函数中取消引用指针返回的地址?
- 将指向struct的指针强制转换为数组
- 在struct[]中分配char*指针值(结构成员)的最优化方法
- 在类函数中返回Struct指针
- typedef struct 指针进入 JNA
- 将char复制到struct指针char
- 指针函数在类中返回Struct的值
- 初始化Struct指针
- 将指向struct的指针强制转换为数组指针是否有效?
- 自动更新struct中的指针值
- 初始化指向struct语法的指针
- 在c++中初始化指向struct的指针