取消引用时转换为 char 指针的 void 指针崩溃
void pointer cast to a char pointer crashes when dereferencing
我正在尝试在 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
不是有效的内存地址。因此,当您的函数尝试使用该内存地址时,它会崩溃。通常,您甚至不会尝试以这种方式强制使用特定的内存地址。它只在非常特殊的情况下才有效,比如当它在内核 space 或类似的地址中是已知地址时。
如果您想散列一个整数而不是特定的内存位置,它将是:
int j = 420;
DJBHash(&j, sizeof(j));
我正在尝试在 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
不是有效的内存地址。因此,当您的函数尝试使用该内存地址时,它会崩溃。通常,您甚至不会尝试以这种方式强制使用特定的内存地址。它只在非常特殊的情况下才有效,比如当它在内核 space 或类似的地址中是已知地址时。
如果您想散列一个整数而不是特定的内存位置,它将是:
int j = 420;
DJBHash(&j, sizeof(j));