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



我正试图在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;
}

这个get被简单地调用以获得一个散列值: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));

最新更新