我在哪里取消引用NULL指针?

问题描述 投票:0回答:2

有哈希表的定义

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指针为什么?

c pointers segmentation-fault hashtable
2个回答
0
投票

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)之间建立连接。


0
投票

在提供的代码中,hash_tablenode*的数组。数组本身hash_table已初始化,但其元素hash_table[i](类型node*)尚未初始化。然后,由于hash_table[i]->phash_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];
}
© www.soinside.com 2019 - 2024. All rights reserved.