c - 尝试在哈希表中插入键时收到 "Segmentation fault"

标签 c memory hash linked-list hashtable

我正在尝试使用我已经制作的链表结构在 C 中实现开放散列。链接列表结构工作完美,但是当尝试在我的哈希表结构中使用它们时,我经常遇到“段错误(核心转储)”

我已经检查过以确保我使用了正确的数据类型并且分配了正确的内存量。

typedef struct LinkedList LinkedList;

LinkedList* createLinkedList(){
    LinkedList* rslt = malloc(sizeof(Node*)); //Allocate memory for LL
    //rslt->head = calloc(1,sizeof(Node*)); //Allocate memory for head with default Node* value (NULL)
    return rslt;
}

void add_end_LinkedList(LinkedList* x, int v){

    //Special case: LinkedList is empty
    if(x->head == NULL)
        x->head = createNode(v);

    else{
        //Traversing to end of list
        Node* p;
        for(p = x->head; p->next != NULL; p = p->next){1;}
        p->next = createNode(v);
    }
}

void add_beg_LinkedList(LinkedList* x, int v){
    Node* p;

    //Special case: LinkedList is empty
    if(x->head == NULL)
        x->head = createNode(v);

    else{
        p = createNode(v);
        p->next = x->head;
        x->head = p;
    }
}

int isIn_LinkedList(LinkedList* x, int v){
    for(Node* p = x->head; p != NULL; p = p->next){
        if(p->val == v) return 1;
    }

    return 0;
}

void print_LinkedList(LinkedList* x){
    for(Node* p = x->head; p != NULL; p = p->next){
        print_Node(p);
        printf(", ");
    }
    printf("\n");
    return;
}

//HASHTABLE_____________________________________________________________

struct HashTable{
    LinkedList** table;

};

typedef struct HashTable HashTable;

HashTable* createTable(){
    HashTable* rslt = {calloc(9,sizeof(LinkedList*))};

    for(int i = 9; i < 9; i++)
        rslt->table[i] = createLinkedList();

    return rslt;
}

int compute_hash(int v){
    return v%9;
}

int isIn_HashTable(HashTable* x, int v){
    return isIn_LinkedList(x->table[compute_hash(v)], v);
}

int insert_HashTable(HashTable* x, int v){
    if(isIn_HashTable(x, v)){
        return 0;
    }

    add_beg_LinkedList(x -> table[compute_hash(v)], v);
    return 1;
}

int main(void){
    HashTable* a = createTable();
    insert_HashTable(a, 6);
    return 0;
}

createTable() 不会引发任何运行时错误。但任何其他哈希表函数都可以。我无法访问表中的链接列表。

最佳答案

Rslt 是一个指针。你不能像初始化struts 那样初始化它。从函数返回后,以下代码中的 rslt 指针将失效

 HashTable* createTable(){
     HashTable* rslt = {calloc(9,sizeof(LinkedList*))};

{..} 不是动态内存分配。首先尝试 malloc rslt

     HashTable *rslt = malloc(sizeof(HashTable));
     rslt->table = calloc...

关于c - 尝试在哈希表中插入键时收到 "Segmentation fault",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57318909/

相关文章:

C 指针算术填充结构

c - 为什么复合位移不将前导半字节设置为 0?

java - 在服务器上提交表单之前对密码进行哈希处理

java - 缺少内存 : size of young generation includes only one survivor space

c++ - 读取 DICOM 文件时在 Release模式下出现 ITK 访问冲突错误,但在 Debug模式下不会出现 ITK 访问冲突错误

c - 链表中的键值被丢弃

cocoa - Mac OS 上 Glib 夸克的模拟

c - 通过选择等待数据不起作用

c - 如何使用 Clang 查找内存泄漏

javascript - 如何从对象和类中清除 javascript 中浏览器的内存?