初始化新哈希Table,指针问题

Initialize new Hash Table, pointers issue

我有以下家庭作业练习:

考虑以下定义来表示具有冲突处理链接的动态散列table。

typedef struct entry{
   char key[10];
   void *info;
   struct entry *next;
}   *Entry;

typedef struct hashT{
   int hashsize;
   Entry *table;
}   *HashTable;

定义`HashTable newTable(int hashsize) 请注意,必须分配必要的内存,并且所有 table 条目必须用空列表初始化。

我的提议是这样的:

HashTable newTable(int hashSize){
   Entry *table = malloc(sizeof((struct entry)*hashSize));
   HashTable *h = malloc(sizeof(struct hashT));
   h->hashSize = hashSize;
   h->table = table;
   return h;
}

我很确定逻辑是正确的。我的问题是指针。例如,有时我在 malloc 函数之前看到 (char *),或者在这种情况下 (table *) ……这是必要的吗?

而对于 return,我应该 return h 还是 *h?有什么区别?

谢谢

首先,

Entry *table = malloc(sizeof((struct entry)*hashSize));

将会

Entry table = malloc(sizeof(struct entry)*hashSize);
                           ^^^    
                           Look at the parentheses here.

你也会在这里做同样的改变,

HashTable h = malloc(sizeof(struct hashT));

HashTable也是如此。你忘了你已经隐藏了你不应该在 typedef 中的指针。

通过上述更改,代码将是

HashTable newTable(int hashSize){
   Entry table = malloc(sizeof(struct entry)*hashSize);
   HashTable h = malloc(sizeof(struct hashT));
   h->hashSize = hashSize;
   h->table = table;
   return h;
}

并且不要将指针隐藏在 typedef 后面。(希望我可以用红色写这个,但是是的,这将使您免于许多问题)。

Entry* 的类型是什么?

类型为struct entry **。在您的情况下,您在分配时不需要它。如果你这样做,那就太过分了。

h*h有什么区别?

按类型 hstruct hashT** 类型,因此 *h 将是 struct hashT*.

类型

接下来你要做什么?

  • 在启用警告的情况下编译所有代码。 gcc -Wall -Werror progname.c
  • 检查 malloc 的 return 值。
  • 使用完后释放动态分配的内存。
  • 阅读How to debug small programs.
  • 抢一个 book.