我有以下作业的练习:
请考虑以下定义来表示具有冲突处理链的动态哈希表。
typedef struct entry{
char key[10];
void *info;
struct entry *next;
} *Entry;
typedef struct hashT{
int hashsize;
Entry *table;
} *HashTable;
定义`HashTable newTable(int hashsize)注意必须分配必要的memmory,并且必须用空列表初始化所有表。
我的主张是这样的:
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;
}
我很确定逻辑是正确的。我的问题是指针。例如,有时我看到(char *),或者在这种情况下(table *)在malloc函数之前......这是必要的吗?
对于返回,我应该返回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
and *h
?类型h
类型为struct hashT**
,所以*h
将是struct hashT*
类型。
gcc -Wall -Werror progname.c
malloc
的返回值。