【发布时间】:2010-10-24 02:25:36
【问题描述】:
更新的问题在这里
Memory allocation problem in HashTable
我正在用 C 语言制作一个 HashTable。这就是我所做的。我认为我正走在正确的道路上,但是当我尝试这样做时
main.c
HashTablePtr hash;
hash = createHashTable(10);
insert(hash, "hello");
insert(hash, "world");
HashTable.c
HashTablePtr createHashTable(unsigned int capacity){
HashTablePtr hash;
hash = (HashTablePtr) malloc(sizeof(HashTablePtr));
hash->size = 0;
hash->capacity = capacity;
ListPtr mylist = (ListPtr)calloc(capacity, sizeof(ListPtr)); /* WHY IT DOESN'T ALLOCATE MEMORY FOR mylist HERE?? */
mylist->head = NULL;
mylist->size = 0;
mylist->tail = NULL;
hash->list = mylist;
return hash;
ListPtr 是一个 LinkedList ptr
List.h
typedef struct list List;
typedef struct list * ListPtr;
struct list {
int size;
NodePtr head;
NodePtr tail;
};
...
...
HashTable.h
typedef struct hashtable * HashTablePtr;
typedef struct hashtable HashTable;
struct hashtable {
unsigned int capacity;
unsigned int size;
ListPtr *list;
unsigned int (*makeHash)(unsigned int, void *);
};
...
...
当我运行调试器时,我发现没有内存分配给 myList。在上面的示例中,我的尝试是使其成为一个包含 10 个列表的数组。
请帮我解决这个问题。
如果有帮助的话,我不是 C 方面的专家。
【问题讨论】:
-
您粘贴的代码在 createHashTable 中有许多不一致之处 - 一个额外的 ),调用 createHashTable 时的参数比实际需要的要多。这与您正在运行的代码相同吗?复制粘贴比重新输入要好,因为您可能会在此过程中引入(或修复)错误...
-
我认为如果你不隐藏你的指针,你的很多问题都会变得明显。也就是去掉 ListPtr 和 NodePtr 什么的。
-
哎呀!我只是想让它看起来更干净,然后把它搞砸了。对不起。
-
而且您不需要在纯 C 中从 calloc() 中转换指针 - 转换是隐式完成的,这样可以为您提供更简洁的代码并隐藏更少的错误。
标签: c memory hashtable allocation