取消引用时,将void指针强制转换为char指针会崩溃

时间:2018-12-23 21:35:25

标签: c pointers char dereference

我正在尝试在C中实现DJB算法,以构建类似结构的字典。

如果传递的键是char指针,我的实现效果很好,但是如果传递例如整数,它会崩溃,我不确定为什么以及如何实现这一点。基本上,我需要同时对字符串和整数进行哈希处理。

static unsigned int DJBHash(void* key, unsigned int len) {
    unsigned int hash = 5381;
    unsigned int i = 0;
    char* ptr = (char *)key;

    for (i = 0; i < len; i++)
    {   
        hash += hash << 5;
        hash += *ptr;         /* crashes if key is not originally a char* */
        ptr++;
    }   

    return hash;
}

只需简单地调用它即可获取哈希值: DJBHash((void*)420, sizeof(420));崩溃而DJB((void*)"foo", sizeof("foo"));正常运行。

1 个答案:

答案 0 :(得分:2)

DJBHash(420, sizeof(420));崩溃,而DJB("foo", sizeof("foo"));正常运行。

那是因为使用420在您的程序中不是有效的内存地址。因此,当您的函数尝试使用该内存地址时,它将崩溃。通常,您甚至不会尝试以这种方式强制使用特定的内存地址。它仅在非常特定的情况下才能工作,例如当它在内核空间中是已知地址或类似的地址时。

如果要散列一个整数而不是特定的内存位置,它将是:

int j = 420;
DJBHash(&j, sizeof(j));