c-哈希表的指针数组



我试图在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会这样做,正确的语法是什么?

您正在哈希表中分配单个条目,但没有与这些条目相关的数据,实际上它们是未初始化的,当您尝试使用哈希表时会导致未定义的行为。相反,您应该使用NULL指针初始化ht_table->table指向的指针数组:

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中,不需要强制转换malloccalloc的返回值。分配阵列的一种更安全的方法是:

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

最新更新