Где я разыменую указатель NULL? - PullRequest
0 голосов
/ 02 апреля 2020

есть определение таблицы Ha sh

typedef struct pair
{
    char* key;
    int value;
}pair;

typedef struct node
{
    pair* p;
    struct node* next;
}node;

node* hash_table[HASH_SIZE];    /*pointer to Hash Table*/

и реализовано init_data

void init_data()
{
    int i;
    for (i = 0; i < HASH_SIZE; i++)
    {
        hash_table[i]->p = (pair*)malloc(sizeof(pair));
        if (hash_table[i]->p == NULL)
            printf("Error: in index %d ", i);

        hash_table[i]->p->key = NULL;
        hash_table[i]->p->value = 0;
    }

    curr_size = 0;
}

, и компилятор отправляет мне это сообщение, ссылаясь на него NULL указатель почему?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

В предоставленном коде hash_table - это массив node*. Сам массив hash_table инициализирован, но его элементы hash_table[i] (типа node*) не имеют. Затем, обратная ссылка с hash_table[i]->p вызывает ошибку, поскольку hash_table[i] - это NULL.

Возможно, вы захотите выполнить некоторую инициализацию hash_table перед его фактическим использованием. Нечто подобное должно сработать:

for (int i = 0; i < HASH_SIZE; i++) {
    hash_table[i] = (node*)malloc(sizeof(node));
    if (i > 0)
        hash_table[i-1]->next = hash_table[i];
}
0 голосов
/ 02 апреля 2020

MatheusPortela уже обсудил проблему в комментариях. Вот решение:

После объявления node* hash_table[HASH_SIZE];

Выделить память для hash_table[i]:

for (int i = 0; i < HASH_SIZE; ++i)
{
    hash_table[i] = (node*)malloc(sizeof(node));
}

Это должно устранить ошибку сегментации. Но вы также можете построить связи между узлами (next) внутри этого l oop.

...