【发布时间】:2010-10-26 11:18:43
【问题描述】:
只是尝试制作一种哈希表,每个节点都是一个链表。
刚初始化空间时遇到问题,我做错了什么?
#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;
}
【问题讨论】:
-
作为一般要点;不要在 C 中转换 malloc() 的返回值。
-
具体不要写
p = (HashTable *)malloc(sizeof(HashTable *)),而是p = malloc(sizeof(*p))。强制转换仅用于确保p具有“正确的类型”,即与您用于大小的类型相同。在这种情况下,转换应该是比sizeof中使用的类型多一个星号的类型。既然你在这里弄错了,演员表对你没有任何好处,并且可能会掩盖由于忘记包含 stdlib.h 而导致的错误消息。