如何在C中正确初始化这个哈希表实现?(出现分段错误)



我不确定初始化这个哈希表时我做错了什么。有人能帮忙吗?我在for循环中的bucket列表初始化时遇到了一个segfault,我在那里标记了它。

#define BUCKETMAX 20
#define TABLESIZE 100 
//Node to hold entry
typedef struct node{
    MEntry *entry;
    struct node *next;
}MListNode;
//Bucket linked list to hold Nodes
typedef struct bucket{
    int size;
    MListNode *top;
}BucketList;
//Hash table to hold Bucket Lists
typedef struct mlist{
    int capacity;
    BucketList **bList;
}MList;
MList *ml_create(void){
    //Initialising the hash table
    MList *ml;
    //Check if memory if available to be allocated before assigning capacity
    if((ml = (MList *) malloc(sizeof(BucketList **) * TABLESIZE)) == NULL){
        fprintf(stderr, "Hash Table Could Not be Created (Not Enough Memory)n");
        exit(EXIT_FAILURE);
    }else{
        ml->capacity = TABLESIZE;
        //Initialise the bucket lists
        int i;
        for(i =0; i<TABLESIZE;i++){
            /****************************************************************
            SEGFAULT IS HERE */
            if((ml->bList[i] = (BucketList *) malloc(sizeof(MListNode *) * BUCKETMAX)) ==  NULL){
            /****************************************************************/
                fprintf(stderr, "Bucket List Could Not be Created (Not Enough Memory)n");
                exit(EXIT_FAILURE);
            }else{
                ml->bList[i]->size = 0;
                ml->bList[i]->top = (MListNode *) NULL; 
            }
        }
    }
    return ml;
}

任何帮助都将不胜感激,谢谢。

不能像这样为结构分配内存。

ml = (MList *) malloc(sizeof(BucketList **) * TABLESIZE)

该行将内存分配给MList结构ml,但不分配给它的成员ml->bList,然后您将在segfault点填充循环。

您需要分别为这两个目的分配内存:

ml = malloc(sizeof(MList));
ml->bList = malloc(sizeof(BucketList*) * TABLESIZE);

这同样适用于ml->bList[i]的后一种存储器分配。

最新更新