我的程序有一个设置错误,因为在某个时刻,指针的值被设置为 0x11。我不知道为什么或如何发生这种情况,而且代码太长,无法发布在这里。因此,我想检查并避免指针指向 0x11 的这种情况。
现在,我有 if (ptr != 0)
这很好,因为它检查 NULL 指针。但它不会检查这个随机损坏的指针。我试过if (ptr <= 0x11)
我还尝试将 ptr 转换为各种类型( long
、 int
等),但它永远不会捕获它。
有没有办法捕获这个指针,这样if
语句返回 false?
编辑:ptr
类型为void*
最佳答案
正如 SergeyA 在评论中所写,你的方法是错误的。您不应该寻找特定值0x11
。更有可能的是,指针恰好具有该值。
我建议您使用gcc -Wall -Wextra -pedantic
进行编译并注意所有警告。我会特别寻找未初始化的变量。请记住,指针不会自动初始化为 null。如果未初始化,它们(可能)将具有之前恰好存在于内存中的任何值。我说“可能”是因为编译器可以将它们初始化为 null,甚至另一个值,而不会违反 C 标准。
此外,正如尤金在评论中所写,检测到指针具有此特定值并不能解决您的问题。如果幸运的话,它可能会帮助您找到问题,但这很可能是浪费时间。
我可能会提到你的测试是正确的。看一下这段代码:
#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
,但可能性很小。我认为这可能是查找问题的一个很好的方法。
关于c - 如何检查void指针是否指向任意低地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55171988/