有哈希表的定义
typedef struct pair
{
char* key;
int value;
}pair;
typedef struct node
{
pair* p;
struct node* next;
}node;
node* hash_table[HASH_SIZE]; /*pointer to Hash Table*/
并且有init_data的实现
void init_data()
{
int i;
for (i = 0; i < HASH_SIZE; i++)
{
hash_table[i]->p = (pair*)malloc(sizeof(pair));
if (hash_table[i]->p == NULL)
printf("Error: in index %d ", i);
hash_table[i]->p->key = NULL;
hash_table[i]->p->value = 0;
}
curr_size = 0;
}
并且编译器向我发送此消息-引用NULL指针为什么?
MatheusPortela已经在评论中讨论了这个问题。这是解决方案:
宣告node* hash_table[HASH_SIZE];
之后
为hash_table[i]
分配内存:
for (int i = 0; i < HASH_SIZE; ++i)
{
hash_table[i] = (node*)malloc(sizeof(node));
}
这将消除分段错误。但是,您也可以在该循环内的节点(next
)之间建立连接。
在提供的代码中,hash_table
是node*
的数组。数组本身hash_table
已初始化,但其元素hash_table[i]
(类型node*
)尚未初始化。然后,由于hash_table[i]->p
为hash_table[i]
,因此用NULL
取消引用会引发错误。
您可能想要在实际使用之前对hash_table
进行一些初始化。这样的事情应该可以解决问题:
for (int i = 0; i < HASH_SIZE; i++) {
hash_table[i] = (node*)malloc(sizeof(node));
if (i > 0)
hash_table[i-1]->next = hash_table[i];
}