C 哈希表的指针数组
我试图用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
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时,该循环会发出缓冲区溢出警告,我认为这与此有关。那我就呆在卡洛克。