C 取消引用时,向字符指针强制转换的无效指针崩溃

C 取消引用时,向字符指针强制转换的无效指针崩溃,c,pointers,char,dereference,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 *)ke

我正试图用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;
}
static unsigned int DJBHash(void*键,unsigned int len){
无符号整数散列=5381;
无符号整数i=0;
char*ptr=(char*)键;
对于(i=0;iDJBHash(420,sizeof(420));
在DJB(“foo”,sizeof(“foo”))运行时崩溃;工作得非常好

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

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

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

为什么您希望强制转换到错误的类型才能起作用?强制转换只会更改指针算法,据我所知,我不明白这会如何导致在取消引用What is
key
时无法获取值?您的问题不在强制转换中。发布代码的erst。崩溃是因为您将指针传递到了备忘录未分配或超出其大小的ry请始终在编译器中启用警告。如果在需要地址时传递
420
,编译器应向您发出警告。整数不是指针。谢谢,这是我对C所不了解的,对这种语言来说还是相当陌生的,我想当然地认为这会发生简单的工作。@AlanCasanova这可能会有帮助:非常有用,谢谢。