首页 > 解决方案 > 哈希表的指针数组

问题描述

我正在尝试在 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;

创建表时我的mallocs:

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;
}

分配表时,我的第二个 malloc 没有创建我希望他做的所需大小的指针数组:调试器的图片

为什么我的 malloc 会这样做,正确的语法是什么?

标签: cpointershashmalloc

解决方案


您正在分配哈希表中的各个条目,但没有与这些条目关联的数据,实际上它们未初始化,当您尝试使用哈希表时会导致未定义的行为。相反,您应该只用指针初始化指向的指针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;

malloc也不是在 C 中,不需要转换and的返回值calloc。分配数组的一种更安全的方法是:

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

推荐阅读