我正致力于为作业创建哈希表实现。我将哈希表定义为结构如下:
raw_data
我必须在使用双指针的方法中初始化哈希表结构,例如:
typedef struct hashtable {
int size;
int entries;
int table*; // pointer to table. Each entry will point to linked list
// of key-value nodes
} hashtable;
我已经在下面写了一个基本的实现:
void init(hashtable** ht) {
...
}
但是,我一直收到以下编译错误:
#include <stdio.h>
#include <stdlib.h>
typedef struct hashtable {
int size;
int entries;
int table*; // pointer to table. Each entry will point to linked list
// of key-value nodes
} hashtable;
void init(hashtable**);
void init(hashtable** ht) {
*ht = (hashtable *) malloc( sizeof(hashtable) );
*ht->size = 3;
}
int main(){
hashtable *t = NULL;
init(&t);
printf("t.size: %i", t->size);
}
所以我对以下内容感到困惑: 1.我不确定在向指针传递指针时如何在init函数中创建新结构。 2.分配结构后,如何修改结构成员属性?
答案 0 :(得分:2)
您的代码中有2个错误:
int table*
- &gt; int *table
- 声明指向整数的指针
* ht-&gt; size - &gt; (*ht)->size
- 当您不确定operator precedence
答案 1 :(得分:2)
这只是运营商优先问题。
编译器进程 - &gt;之前 *。因此,它尝试访问struct hashtable **的size成员,这是不可能的。
如果您使用(* ht) - &gt;尺寸交换* ht-&gt;尺寸,代码就会编译。
答案 2 :(得分:1)
问题在于
从here 可以看出, ->
的优先级高于C中的*
使用优先级规则*ht->size
转换为*(ht-&gt; size)。这应该说明你得到错误的原因。另一种看待它的方法是
*(ht->size)=(*(*ht).size)
使用括号修复此问题,如下所示:(*ht)->size
hashtable
的定义还有另一个问题:
int table*;
将无法编译。请改用int *table;
来声明pointer to int
?
答案 3 :(得分:1)
这是一个好的开始,其他人已经解决了代码中的主要问题。但是,我建议进行一些小调整:
#include <stdio.h>
#include <stdlib.h>
typedef struct hashtable {
int size;
int entries;
int table*; // pointer to table. Each entry will point to linked list
// of key-value nodes
} hashtable;
// note: freeing the hashtable is a caller responsibility!
hashtable *new_hashtable() {
hashtable *ht = malloc( sizeof(hashtable) );
ht->size = 3; // since ht is only a single pointer, no need for (*ht)->foo
return ht;
}
int main(){
hashtable *ht = new_hashtable();
printf("ht.size: %i", ht->size);
free(ht);
}
答案 4 :(得分:0)
感谢大家的快速回复。为了将来参考,这里使用解决方案快速更新原始代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct hashtable {
int size; // size of hash table
int entries; // number of slots allocated in table
int *table; /* pointer to table. Each entry will point to linked list
of key-value nodes */
} hashtable;
void init(hashtable**);
void init(hashtable** ht) {
*ht = (hashtable *) malloc( sizeof(hashtable) );
(*ht)->entries = 0;
(*ht)->size = 3; //replace this with better init size, ideally a prime number
(*ht)->table = malloc( (*ht)->size * sizeof(int));
}
int main(){
hashtable *t = NULL;
init(&t);
t->table[2] = 3;
printf("t.size: %i \n", t->size);
printf("t.arr:[2] %i \n", t->table[2]);
free(t);
}