Указатель void, приведенный к указателю на символ, падает при разыменовании
Я пытаюсь реализовать алгоритм DJB в C, чтобы построить словарь, как структура.
Моя реализация работает хорошо, если переданный ключ является указателем на символ, однако, если я передаю, например, целое число, оно выходит из строя, я не уверен, почему и как я могу это сделать. По сути, мне нужно хешировать как строку, так и целое число.
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 ответ
DJBHash(420, sizeof(420));
в то время как аварии DJB("foo", sizeof("foo"));
отлично работает
Это потому, что с помощью 420
неверный адрес памяти в вашей программе. Поэтому, когда ваша функция пытается использовать этот адрес памяти, происходит сбой. Обычно вы даже не пытаетесь форсировать конкретный адрес памяти таким способом. Это работает только в очень специфических случаях, например, когда это известный адрес в пространстве ядра или что-то в этом роде.
Если вы хотите хешировать целое число вместо конкретной ячейки памяти, это будет:
int j = 420;
DJBHash(&j, sizeof(j));