我的程序出现了设置错误,因为在某些时候,指针的值被设置为0x11。我不知道为什么或如何发生这种情况,并且代码太长了,无法在此处发布。因此,我想检查并避免这种情况,即指针指向0x11。
现在,我有if (ptr != 0)
很好,因为它检查NULL指针。但它不会检查此随机断开的指针。我尝试了if (ptr <= 0x11)
,还尝试了将ptr转换为各种类型(long
,int
等),但是它从来没有被抓住。
是否有一种方法可以捕获此指针,以便if
语句返回false?
编辑:ptr
的类型为void*
答案 0 :(得分:2)
正如SergeyA在评论中所写,您的方法是错误的。您不应该寻找特定的值0x11
。指针很可能恰好具有该值。
我建议您使用gcc -Wall -Wextra -pedantic
进行编译,并注意所有警告。我尤其会寻找未初始化的变量。请记住,指针不会自动初始化为null。如果未初始化,则它们(可能)将具有之前恰好在内存中的任何值。我说“可能” 是因为编译器 可以将它们初始化为null或另一个值,而不会违反C标准。
此外,正如Eugene在评论中所写,检测到指针具有此特定值并不能解决您的问题。如果幸运的话,它可以帮助您发现问题,但是很可能浪费时间。
我可能会提到您的测试是正确的。看这段代码:
#include <stdio.h>
int main()
{
void *ptr = (void*)0x11;
if(ptr == (void*)0x11) printf("ptr == 0x11\n");
if(ptr <= (void*)0x11) printf("ptr <= 0x11\n");
if(ptr <= (void*)0x10) printf("ptr <= 0x10\n");
}
它输出:
$ ./a.out
ptr == 0x11
ptr <= 0x11
正如预期的那样。这表明您的代码具有未定义的行为。
您可以做的另一件事是对自己选择的某个值进行显式初始化。看这段代码:
int main(int argc, char ** argv) {
// 42 is 2a in hex, and 42 is a good random value
char *ptr=(void*)0x2a;
// If any arguments are supplied to the program if(argc > 1) {
ptr = argv[1];
printf("The first argument has address %p\n", (void*) ptr);
}
if(ptr == (void*) 0x2a)
printf("Something fishy happened.\n");
}
输出:
$ ./a.out
Something fishy happened.
$ ./a.out foo
The first argument has address 0x7ffca6323ad8
虽然第一个参数的地址实际上可能是0x2a
,但极不可能。我认为这可能是发现问题的一种很好的方法。