我有一个指针,我“手动”设置它指向的地址:
pPlayerPool = reinterpret_cast<DWORD*>(someAddress+PLAYER_POOL_POINTER_OFFSET);
当游戏尚未开始时,pPlayerPool
指向0x0,这就是我在内存搜索工具中所说的内容。我试着用
if(*pPlayerPool)
或
if(*pPlayerPool != 0)
或
if(*pPlayerPool != NULL)
当程序为0x0时,我的程序总是崩溃。
然后我还有一个小问题:我知道*
给了我指针的值和&
指针本身的地址。但是,这个值意味着我没有任何这些角色?
答案 0 :(得分:4)
这是因为你试图取消引用空指针。不要取消引用它只是检查它的值。
if(pPlayerPool)
if(pPlayerPool != 0)
当你这样做时
*pPlayerPool != 0
您正在测试pPlayerPool
的指向的内容是否为零。不是pPlayerPool
是sero。
答案 1 :(得分:1)
每当您使用*pointerName
时,您正在检索指向的值
&someValue
为您提供指向 someValue
地址的指针。例如:
int *pointer;
int value;
value = 4;
pointer = &value;
// pointer now points to the address of value.
// *pointer will now give you a value of 4
如果使用&pointerName
,则会获得指向指针地址的指针。也就是说,结果是指向指针的指针。
int **pointerToPointer;
pointerToPointer = &pointer;
// now if you dereference pointerToPointer twice, you will get 4
// if you dereference it once, you will have the address of value
如果您使用没有这些运算符的指针,那么它只是指向的地址编号。
对于if语句,您使用的是*pPlayerPool
。这意味着您正在尝试访问指向的位置的值,您已经说过该值为0x0。访问0x0是一个错误,如果你尝试,操作系统将终止你的程序。相反,只需使用pPlayerPool
:
if(pPlayerPool)
// or
if(pPlayerPool != 0)
此外,为什么要手动设置指针?这是非常危险的,并且可以(读取:将)导致更多错误。如果您尝试在一个地方收集多个值,请使用类或结构,因为编译器可以为您计算数据偏移量。
答案 2 :(得分:0)
如果*pPlayerPool
为NULL,那么您应该能够:
if (*pPlayerPool)
(或该主题的任意数量的变体)。
然而,听起来这是错误的。我希望这是因为你试图在另一个进程中操作内存,你要么注入一个DLL,要么用调试接口“调试”,其他进程不是“就绪”或“已启动”。在这种情况下,您根本无法检查该地址,因为它的内存根本就不存在。地址本身不是“有效”。
您需要找到一种不同的方式来确定游戏是否已经开始,或者使用Windows Strucuted Exception处理,例如:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681409%28v=vs.85%29.aspx
链接中的示例显示如何“捕获”除以零,但您可以使用相同的内容来检查内存访问是否有效等。GetExceptionCode
将为您提供EXCEPTION_ACCESS_VIOLATION
如果你有内存访问冲突。