我不确定初始化这个哈希表时我做错了什么。有人能帮忙吗?我在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]
的后一种存储器分配。