如何检查指针指向的地址是否为0x0?

时间:2014-03-07 23:02:38

标签: c++ pointers

我有一个指针,我“手动”设置它指向的地址:

pPlayerPool = reinterpret_cast<DWORD*>(someAddress+PLAYER_POOL_POINTER_OFFSET);

当游戏尚未开始时,pPlayerPool指向0x0,这就是我在内存搜索工具中所说的内容。我试着用

检查一下
if(*pPlayerPool)

if(*pPlayerPool != 0)

if(*pPlayerPool != NULL)

当程序为0x0时,我的程序总是崩溃。

然后我还有一个小问题:我知道*给了我指针的值和&指针本身的地址。但是,这个值意味着我没有任何这些角色?

3 个答案:

答案 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如果你有内存访问冲突。