c - 如何检查void指针是否指向任意低地址?

标签 c pointers

我的程序有一个设置错误,因为在某个时刻,指针的值被设置为 0x11。我不知道为什么或如何发生这种情况,而且代码太长,无法发布在这里。因此,我想检查并避免指针指向 0x11 的这种情况。

现在,我有 if (ptr != 0)这很好,因为它检查 NULL 指针。但它不会检查这个随机损坏的指针。我试过if (ptr <= 0x11)我还尝试将 ptr 转换为各种类型( longint 等),但它永远不会捕获它。

有没有办法捕获这个指针,这样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/

相关文章:

c - linux 和 macOS 之间的不同打印行为

c - 读取内核空间中的符号链接(symbolic link)

C 将 void* 数据转换为 typedef 结构

c - 在C程序中打印链表

c - 在不使用任何指针的情况下反转单链表

C++ 使用 *i 指针打开文件,在 Linux 中覆盖但在 Windows 中不覆盖

c++ - 这个 `const char*` 的断言保证是真的吗?

c - 如何使用 getline(s, lc) 函数更新 int 变量而不使用 "pointers"? (C)

c - 无法在没有 $DISPLAY for X11 的情况下自动启动 dbus-daemon。网 bean 。 Pi 作为远程主机

c - cpu怎么知道内存中的数据是数据还是命令呢? (C 编程)