我试图在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中,不需要强制转换malloc
和calloc
的返回值。分配阵列的一种更安全的方法是:
if ((ht_table->table = calloc(size, sizeof(*ht_table->table))) == NULL)
return NULL;