用C语言实现具有奇怪seg错误的哈希表
我试图用C语言制作一个哈希表,我想记录一个包含表中每个唯一键的链表。然而,我在while循环的一开始就遇到了一个seg错误,我用它来检查一个键是否已经在链表中。有人能理解这里发生了什么吗 提前道歉:ull未签名long-long h_keys是一个全局变量 seg故障发生在该while回路的开始处用C语言实现具有奇怪seg错误的哈希表,c,linked-list,hashmap,malloc,hashtable,C,Linked List,Hashmap,Malloc,Hashtable,我试图用C语言制作一个哈希表,我想记录一个包含表中每个唯一键的链表。然而,我在while循环的一开始就遇到了一个seg错误,我用它来检查一个键是否已经在链表中。有人能理解这里发生了什么吗 提前道歉:ull未签名long-long h_keys是一个全局变量 seg故障发生在该while回路的开始处 void put_in_key(ull address){ struct mem_node * cur = h_keys; ull key = hash_func(address);
void put_in_key(ull address){
struct mem_node * cur = h_keys;
ull key = hash_func(address);
printf("ok %lld\n",address);
while(cur){
//printf("stuck in here?\n");
if(cur->key==key){ // key already in hashtable keys
return;
}
cur=cur->next;
}
struct mem_node* newkey = malloc(sizeof(struct mem_node *));
if(newkey==NULL){
printf("big trouble");
}
newkey->key=key;
cur->next=newkey;
}
这是结构图
struct mem_node{ // add one of these each time we get a new window
ull address;
ull page;
ull key;
struct mem_node * next;
};
这是h_密钥的声明
h_keys=malloc(sizeof(struct mem_node*));
然后根据输入,我有时会到达另一个函数的一部分,该函数计算linkedlist的长度。然而,我在while循环的第1行也得到了一个segfault
struct mem_node* counter = h_keys;
ull uniques=0;
while(counter!=NULL && counter->next!=NULL){
printf("whafs da %lld\n",uniques);
//printf("%lld\n",counter->key);
//printf("%lld \n",counter->ne)
fflush(stdout);
uniques++;
counter=counter->next;
}
代码太不完整。请提供完整的代码作为参考。有一点看起来是错误的:
malloc(sizeof(struct mem_node*)
应该是malloc(sizeof(struct mem_node))
;顺便说一句,如果不是完全错误的话,使用链表实现哈希表是很奇怪的。哈希表的要点是,它允许您直接跳到与密钥哈希匹配的节点。只有冲突(具有相同哈希但数据值不同的节点)才需要遍历列表。通常哈希表是用数组实现的。@kaylum我使用linkedlist跟踪哈希表的键,有点像python中的dic.keys()方法。因为我需要计算映射到非空项的键的总数,所以我需要计算键的总数。如果这就是您所需要的,那么您应该在每次添加或删除新密钥时保持运行计数。无论如何,主要的一点是,您的代码不完整,因此我们无法有效地提供帮助,并且您的分配大小看起来是错误的。请提供完整的代码。@kaylum好的,我将尝试这种方法并跳过链表。非常感谢。