我试图编写一个程序来创建一个hash_table来处理与链式列表的冲突。链式列表将由一个由2个字符组成的结构组成。 我想在链表的开头插入这种类型的结构,但我一直在线上遇到seg故障,我不明白为什么。 这是我的代码:
typedef struct celula //this is the chained list structure
{
struct celula *urm;
void *info;
} TCelulaG, *TLG;
typedef struct //this is the hash_table structure
{
size_t M;
TLG * v;
} TD;
typedef struct // the structure that should be inserted
{
char *key;
char *value;
} TDate;
我有一个哈希函数和一个初始化函数(设置表的每个参数为null),效果很好。
现在插入功能:
int put(TDate element, TD * hash_table,size_t M)
{
TLG it,aux,ant;
size_t h=hash(element.key,M);
it=(TLG)malloc(sizeof(TCelulaG));
it= hash_table->v[h];
it->info=(TDate*)malloc(sizeof(TDate)); //this is the line that causes the segfault
it = hash_table->v[h];
if(it==NULL)
{
((TDate*)((it)->info))->key=element.key;
((TDate*)((it)->info))->value=element.value;
it->urm=hash_table->v[h];
hash_table->v[h]=it;
return 1;
}
}
答案 0 :(得分:0)
确保it
不为空。
为什么要分配到it
,然后使用hash-table->v[h]
的作业进行分配。 hash_table->v[h]
可能是null,因此是段错误。在分配到it
之前检查it->info
。