只是尝试制作一种哈希表,每个节点都是一个链表。
在初始化空间时遇到麻烦,我做错了什么?
#include <stdlib.h>
typedef struct entry {
struct entry *next;
void *theData;
} Entry;
typedef struct HashTable {
Entry **table;
int size;
} HashTable;
int main(){
HashTable *ml;
ml = initialize();
return 0;
}
HashTable *initialize(void)
{
HashTable *p;
Entry **b;
int i;
if ((p = (HashTable *)malloc(sizeof(HashTable *))) == NULL)
return NULL;
p->size = 101;
if ((b = (Entry **)malloc(p->size * sizeof(Entry **))) == NULL)
return NULL;
p->table = b;
for(i = 0; i < p->size; i++) {
Entry * b = p->table[i];
b->theData = NULL;
b->next = NULL;
}
return p;
}
答案 0 :(得分:9)
您需要将sizeof(HashTable*)
更改为sizeof(HashTable)
,将sizeof(Entry **)
更改为sizeof(Entry *)
。第二件事是每个Entry
你需要在循环内再次使用malloc
分配内存。
答案 1 :(得分:1)
if ((p = malloc(sizeof(HashTable))) == NULL)
return NULL;
p->size = 101;
if ((b = malloc(p->size * sizeof(Entry *))) == NULL)
return NULL;
我认为删除malloc()
结果广告是最佳做法。
另外,正如@Naveen首先指出的那样,你还需要为每个Entry
分配内存。
答案 2 :(得分:0)
首先你的sizeofs错了。 T * = malloc(num * sizeof(T))是正确的。您也可以使用calloc。
您正在重复使用b用于不同目的,因此非常混乱。使用单个字符变量通常不太好。
p-&gt;表b是分配但未初始化的,即它没有指向任何有用的东西,那么你试图取消引用它。
你需要首先填充Entry *指针,如果要取消引用它们,它们必须指向有效的Entry结构。
您的流程可能会在第b行&gt; theData = NULL
上消失答案 3 :(得分:0)
此外,您可以静态地声明您的HashTable,无论是本地还是在堆栈中足够高的某个区域,堆栈在使用时是非升序(在内存中)并将指向HashTable的指针传递给初始化函数避免使用malloc。 malloc很慢。
所以在主要方面,你可以这样做:
HashTable表; InitializeHashTable(安培;表);
//使用表格(无需免费) //只是不要返回表