Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言实现具有奇怪seg错误的哈希表_C_Linked List_Hashmap_Malloc_Hashtable - Fatal编程技术网

用C语言实现具有奇怪seg错误的哈希表

用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);

我试图用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);
    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好的,我将尝试这种方法并跳过链表。非常感谢。