указатель void, приведенный к указателю на символ, падает при разыменовании - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь реализовать алгоритм 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 Ответ

0 голосов
/ 24 декабря 2018

DJBHash(420, sizeof(420)); падает, пока DJB("foo", sizeof("foo")); работает отлично.

Это потому, что использование 420 не является допустимым адресом памяти в вашей программе.Поэтому, когда ваша функция пытается использовать этот адрес памяти, происходит сбой.Обычно вы даже не пытаетесь форсировать конкретный адрес памяти таким способом.Это работает только в очень специфических случаях, например, когда это известный адрес в пространстве ядра или что-то в этом роде.

Если вы хотите хешировать целое число вместо конкретной ячейки памяти, это будет:

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