C++ 解引用指针以操作地址的内容

C++ 解引用指针以操作地址的内容,c++,pointers,C++,Pointers,我正在尝试更改纸牌中提供时间的地址的值 给定以下代码,基址+偏移量0x97074应指向偏移量为0x50的另一个地址,最后此地址应指向偏移量为x0C的最终地址以更改时间值 但是,当我执行此操作时,纸牌崩溃 HMODULE hModule = GetModuleHandle(nullptr); sstream << std::hex << reinterpret_cast<unsigned int>(hModule); str = sstream.str(); B

我正在尝试更改纸牌中提供时间的地址的值


给定以下代码,基址+偏移量0x97074应指向偏移量为0x50的另一个地址,最后此地址应指向偏移量为x0C的最终地址以更改时间值

但是,当我执行此操作时,纸牌崩溃

HMODULE hModule = GetModuleHandle(nullptr);
sstream << std::hex << reinterpret_cast<unsigned int>(hModule);
str = sstream.str();
BaseAddress = reinterpret_cast<DWORD>(str.c_str());

//MessageBox(NULL, (LPCSTR) BaseAddress, "Adress", MB_OK); just some reminder
*(*(*(*(DWORD *) BaseAddress + (DWORD *) BASE_OFS_DEF ) + (DWORD *)TIME_OFS1_DEF ) + (DWORD *)TIME_OFS2_DEF) = 500;
HMODULE HMODULE=GetModuleHandle(nullptr);

sstream逻辑错误,在添加偏移量并将偏移量转换为指针之前,您正在取消对指针的引用!我想这就是你想要的

*(DWORD*)(*(DWORD*)(*(DWORD*)(BaseAddress + BASE_OFS_DEF) + TIME_OFS1_DEF) + TIME_OFS2_DEF) = 500;
但是你真的应该把它分解一下,以帮助理解发生了什么

DWORD temp1 = *(DWORD*)(BaseAddress + BASE_OFS_DEF);
DWORD temp2 = *(DWORD*)(temp1 + TIME_OFS1_DEF);
*(DWORD*)(temp2 + TIME_OFS2_DEF) = 500;

逻辑是错误的,在添加偏移量并将偏移量转换为指针之前,您正在取消对指针的引用!我想这就是你想要的

*(DWORD*)(*(DWORD*)(*(DWORD*)(BaseAddress + BASE_OFS_DEF) + TIME_OFS1_DEF) + TIME_OFS2_DEF) = 500;
但是你真的应该把它分解一下,以帮助理解发生了什么

DWORD temp1 = *(DWORD*)(BaseAddress + BASE_OFS_DEF);
DWORD temp2 = *(DWORD*)(temp1 + TIME_OFS1_DEF);
*(DWORD*)(temp2 + TIME_OFS2_DEF) = 500;

“基地址+偏移量0x97074应该指向另一个地址”―是谁说的?据我所知,从CE来看,这些地址指向另一个地址,最后这个地址指向时间地址。如果我错了,请纠正我。我根本不知道你错不错。你从哪里得到这个信息的?什么是CE?“基地址+偏移量0x97074应该指向另一个地址”―是谁说的?据我所知,从CE上看,这些地址指向另一个地址,最后这个地址指向时间地址。如果我错了,请纠正我。我根本不知道你错不错。你从哪里得到这个信息的?CE是什么?谢谢你的回答,但纸牌游戏一直在崩溃,我只是想知道为什么我的基本地址只返回“1F4”而不返回“0x”,这会影响什么吗?在这个地址之前,我必须添加0x吗?@莫斯蒂:不,这不是问题,0X只是在C++代码中编写十六进制整数文字的约定。当你的程序运行时,它并没有任何意义。试着像我展示的那样分解它,看看它在哪条线上崩溃。顺便说一句,我不知道你想做的是对还是错。我只是想产生一些符合你描述的代码。@Mostey刚意识到我的“简化”代码被窃听了。我已经编辑了,希望能纠正它。发现它崩溃是因为最后一行,两个版本都不工作,当实际时间值改变时,它崩溃了。现在要检查偏移量,但确定它们不是问题。感谢您的回答,但纸牌不断崩溃,我只是想知道为什么我的基本地址只返回“1F4”而不返回“0x”,这会影响什么吗?在这个地址之前,我必须添加0x吗?@莫斯蒂:不,这不是问题,0X只是在C++代码中编写十六进制整数文字的约定。当你的程序运行时,它并没有任何意义。试着像我展示的那样分解它,看看它在哪条线上崩溃。顺便说一句,我不知道你想做的是对还是错。我只是想产生一些符合你描述的代码。@Mostey刚意识到我的“简化”代码被窃听了。我已经编辑了,希望能纠正它。发现它崩溃是因为最后一行,两个版本都不工作,当实际时间值改变时,它崩溃了。现在要检查偏移量,但确定它们不是问题所在。