C 哈希表的指针数组

C 哈希表的指针数组,c,pointers,hash,malloc,C,Pointers,Hash,Malloc,我试图用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; 创建表时的My

我试图用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;
创建表时的My 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;
}
if((ht_表=(ht*)malloc(sizeof(ht)))==NULL)
返回NULL;
如果((ht\U表格->表格=(ht\U条目**)malloc(大小*(大小)(ht\U条目*))==NULL)
返回NULL;
对于(i=0;i表[i]=(ht_条目*)malloc(sizeof(ht_条目)))==NULL)
返回NULL;
}
分配表时,我的第二个malloc不会创建我希望他执行的所需大小的指针数组:


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

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

ht_table->size = size;
ht_table->entry_count = 0;
for (i = 0; i < size; i++) {
    ht_table->table[i] = NULL;
}
在C中也不是这样,不需要强制转换
malloc
calloc
的返回值。分配阵列的更安全方法是:

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

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

ht_table->size = size;
ht_table->entry_count = 0;
for (i = 0; i < size; i++) {
    ht_table->table[i] = NULL;
}
在C中也不是这样,不需要强制转换
malloc
calloc
的返回值。分配阵列的更安全方法是:

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

是的,谢谢你,我完全忘了用空值初始化。我也尝试了calloc来解决我的问题,但不管我写的是什么大小,它仍然会生成一个1的数组。@mynael:数组是由
calloc()
分配给您指定的大小的,但是调试器只显示第一个条目,因为
ht\u table->table
只是指向指针的指针,调试器无法猜测它指向的数组中的指针数。将其声明为
HT_条目*表[]可能会有所不同,也可能不会。这两个声明都是等价的,但是这一个向程序员表明
是指向一个数组,而不是指向一个指针。就在将malloc+用于cycle时,该循环会发出缓冲区溢出警告,我认为这与此有关。那我就呆在calloc。是的,谢谢你,我完全忘了用空值初始化。我也尝试了calloc来解决我的问题,但不管我写的是什么大小,它仍然会生成一个1的数组。@mynael:数组是由
calloc()
分配给您指定的大小的,但是调试器只显示第一个条目,因为
ht\u table->table
只是指向指针的指针,调试器无法猜测它指向的数组中的指针数。将其声明为
HT_条目*表[]可能会有所不同,也可能不会。这两个声明都是等价的,但是这一个向程序员表明
是指向一个数组,而不是指向一个指针。就在将malloc+用于cycle时,该循环会发出缓冲区溢出警告,我认为这与此有关。那我就呆在卡洛克。