c - 取消引用时,void 指针转换为 char 指针会崩溃

标签 c pointers char dereference

我正在尝试用 C 语言实现 DJB 算法来构建类似字典的结构。

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

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")); 完美运行很好。

最佳答案

DJBHash(420, sizeof(420)); 崩溃,而 DJB("foo", sizeof("foo")); 工作得很好。

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

如果你想散列一个整数而不是特定的内存位置,那就是:

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

关于c - 取消引用时,void 指针转换为 char 指针会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53907334/

相关文章:

python - 在 C : is it better to create a static local variable or a passing an array by pointer 中填充一个数组

C 转换和字符符号

c# - 从 C# 调用 C DLL 函数 - 将 char 参数转换为字符串

c - 空指针的应用

c - 在文本文件 C 中最多读取两行时出现问题

python - Python 中如何进行位运算?

c - 如何以 char 的十六进制值获取二进制表示

计数排序算法在 C 中不起作用

c - 在循环中创建一个新指针 C

C 指针错误,得到 exc_bad_access code=2,address0x100000000