Указатель 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));
Другие вопросы по тегам