初始化新哈希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
有什么区别?
按类型 h
是 struct hashT**
类型,因此 *h
将是 struct hashT*
.
类型
接下来你要做什么?
- 在启用警告的情况下编译所有代码。
gcc -Wall -Werror progname.c
- 检查
malloc
的 return 值。
- 使用完后释放动态分配的内存。
- 阅读How to debug small programs.
- 抢一个 book.
我有以下家庭作业练习:
考虑以下定义来表示具有冲突处理链接的动态散列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
有什么区别?
按类型 h
是 struct hashT**
类型,因此 *h
将是 struct hashT*
.
接下来你要做什么?
- 在启用警告的情况下编译所有代码。
gcc -Wall -Werror progname.c
- 检查
malloc
的 return 值。 - 使用完后释放动态分配的内存。
- 阅读How to debug small programs.
- 抢一个 book.