Массив указателей для таблицы ha sh - PullRequest
1 голос
/ 10 апреля 2020

Я пытаюсь реализовать простую таблицу ha sh в C, где у меня есть две структуры, одна для записей и одна для самой таблицы:

typedef struct hash_table_entry {
    int key;
    int data;
    struct hash_table_entry *next;
} HT_ENTRY;

typedef struct hash_table {
    int size;
    int entry_count;
    HT_ENTRY **table;
} HT;

Мои malloc при создании таблицы:

if ((ht_table = (HT*)malloc(sizeof(HT))) == NULL)
    return NULL;
if ((ht_table->table = (HT_ENTRY**)malloc(size * (sizeof(HT_ENTRY*)))) == NULL)
    return NULL;
for (i = 0; i < size; i++) {
    if ((ht_table->table[i] = (HT_ENTRY*)malloc(sizeof(HT_ENTRY))) == NULL)
        return NULL;
}

При выделении таблицы мой второй mallo c не создает массив указателей нужного размера, который я бы хотел, чтобы он делал: pi c отладчика

Почему мой mallo c делает это и каков будет правильный синтаксис?

1 Ответ

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

Вы выделяете отдельные записи в таблице ha sh, но нет данных, связанных с этими записями, они действительно неинициализированы, что приводит к неопределенному поведению при попытке использовать таблицу ha sh. Вместо этого вы должны просто инициализировать массив указателей, на которые указывает ht_table->table, с помощью NULL указателей:

ht_table->size = size;
ht_table->entry_count = 0;
for (i = 0; i < size; i++) {
    ht_table->table[i] = NULL;
}

Или просто выделить массив с помощью calloc():

ht_table->size = size;
ht_table->entry_count = 0;
if ((ht_table->table = (HT_ENTRY**)calloc(size, sizeof(HT_ENTRY*))) == NULL)
    return NULL;

Также не то, что в C приведение к возвращаемому значению malloc и calloc не требуется. Более безопасный способ размещения массива:

if ((ht_table->table = calloc(size, sizeof(*ht_table->table))) == NULL)
    return NULL;
...