【问题标题】:Where am I dereferencing a NULL pointer?我在哪里取消引用 NULL 指针?
【发布时间】:2020-07-14 21:43:30
【问题描述】:

有哈希表的def

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;
}

然后编译器向我发送这条消息 de-reference NULL 指针 为什么?

【问题讨论】:

  • 错误发生在哪一行?
  • 你的哈希表是一个指针node*,但你没有用malloc初始化它。当您执行hash_table[i]-&gt;p 时,就会发生错误。
  • @MatheusPortela 但是hash_table不是全局声明为任何数组node* hash_table[HASH_SIZE];吗?
  • 你从未为hash_table[i]分配任何内存。
  • @ArdentCoder 在提供的代码中,hash_tablenode* 的数组。数组本身 hash_table 已初始化,但其元素 hash_table[i]node* 类型)尚未初始化。然后,使用hash_table[i]-&gt;p 取消引用会引发错误,因为hash_table[i]NULL

标签: c pointers segmentation-fault hashtable


【解决方案1】:

MatheusPortela 已经在 cmets 中讨论过这个问题。这是解决方案:

声明node* hash_table[HASH_SIZE];

hash_table[i]分配内存:

for (int i = 0; i < HASH_SIZE; ++i)
{
    hash_table[i] = (node*)malloc(sizeof(node));
}

这应该可以消除分段错误。但您也可以在该循环内的节点 (next) 之间建立连接。

【讨论】:

    【解决方案2】:

    在提供的代码中,hash_tablenode* 的数组。数组本身 hash_table 已初始化,但其元素 hash_table[i]node* 类型)尚未初始化。然后,使用 hash_table[i]-&gt;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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 2011-10-06
      • 2020-03-17
      • 2016-05-22
      相关资源
      最近更新 更多