c - 第 25 行中的运行时错误 : Char 35: runtime error: member access within null pointer of type 'struct HASH_TABLE' (solution. c)

标签 c hashtable

#define SIZE 50

typedef struct{
    int key;
    int value;
}HASH_TABLE;

HASH_TABLE* hashArray[SIZE];

int hashCode(int key) {
   return key % SIZE;
}

bool containsDuplicate(int* nums, int numsSize){

    int count = 1,i=0;

    HASH_TABLE* data  = (HASH_TABLE*)malloc(sizeof(HASH_TABLE*));
    data->value = count;

    for(i=0;i<numsSize;i++)
    {
        int hashIndex = hashCode(nums[i]);
        hashArray[hashIndex]->key = nums[i];
        hashArray[hashIndex]->value = data->value;

        ++hashIndex;
        hashIndex %= SIZE;

        if(hashArray[hashIndex]->key == nums[i])
        {
            data->value++;
        }



    }
    if(data->value>0)
        return true;

    return false;
}

我正在尝试使用 C 中的哈希表算法编写代码来查找重复项。

代码应按以下方式工作

给定一个整数数组,查找该数组是否包含任何重复项。

如果任何值在数组中至少出现两次,则函数应返回 true;如果每个元素都不同,则函数应返回 false。

示例1:

输入:[1,2,3,1] 输出:真 示例2:

输入:[1,2,3,4] 输出:假 示例3:

输入:[1,1,1,3,3,4,3,2,4,2] 输出:true

请帮助我解决我的错误

谢谢

最佳答案

您的代码中有几个错误:

  • 您为表中的每个哈希条目仅指定了一个值的空间。这意味着您仅通过哈希值而不是整数值来比较数字。假设您输入 1然后你就有 51 。当您计算模 50 的余数时,两者具有相同的哈希值。作为哈希值,因此它们将进入同一个表条目(索引为 1 的条目),这是第二个条目。当你读到号码 51 ,您更改字段 data 中的值至51 ,并且,如果稍后,到达另一个 1 ,你最终会失去它作为第一个 1你以前有过,当你添加 51 时就飞出去了数字。哈希表允许您获得更快的访问速度,但是您必须存储您可以拥有的所有键,无论它们具有哈希值如何。因此,每个表条目必须支持哈希值均为 x 的条目列表,并且该列表必须包含共享相同哈希值的所有条目,并比较各个键以查看哪个是您正在比较的键。
  • 您应该使用malloc(sizeof *data)malloc(sizeof(HASHTABLE)) ,比你所做的更好。在代码中,您分配字节来保存指针(您指定指针的大小,而不是记录的大小)。 sizeof *data是指向数据的大小(是的,你可以在sizeof运算符之后使用它,即使它还没有被分配,编译器对指向的值不感兴趣,只对它的数据大小感兴趣)
  • 从不,从不,从 malloc(3) 返回的值进行转换。这不是你想要的。它让您忘记#include <stdlib.h> (其中给出了 malloc(3) 的正确原型(prototype)),因此,隐藏更多错误,这比您想要避免的错误要危险得多。 Malloc 始终返回一个指针,但如果您不使用原型(prototype)(如果您将返回的值转换为 #include <stdlib.h> ,则会发生这种情况,编译器将假设 malloc() 返回 int (这不是真的) )并会生成代码将返回的值转换为指向 HASH_TABLE 的指针,这将在最好的情况下丢弃 malloc() 返回的数据。在 64 位架构中,指针是 64 位,而整数只有 32 位。此架构中 malloc 返回的值是 64 位宽...编译器将生成代码来转换(未定义行为)32 位数据的 32 位,并将其(以未定义行为扩展)该数据转换为 64 位,并使具有该数据(未定义行为)的指针。当您尝试将指针用于除打印其值之外的任何其他用途时,您很可能会收到段错误和程序崩溃。
  • 如果你使用这么简单的哈希函数,那么你最好使用质数作为哈希表中的元素数量,这样你就不会得到一些条目挤满了数据,而另一些条目却是空的。使用质数可以更好地分配数字(尽管最好选择更好的哈希表函数)

关于c - 第 25 行中的运行时错误 : Char 35: runtime error: member access within null pointer of type 'struct HASH_TABLE' (solution. c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60119681/

相关文章:

c - 在哈希表上工作时出现段错误

algorithm - 我什么时候应该重新哈希整个哈希表?

algorithm - 如何设计哈希表和堆混合的数据结构

c++ - 此示例的最佳字符串哈希函数

c - 语句 `int val = (++i >++j) ?++i :++j;` 是否调用未定义的行为?

c - 在哪里可以找到最小边界框算法的 c/c++ 实现?

c - C程序运行时出现段错误

c++ - C++(C++11 之前)是否存在哈希表?

c - 仅在某些条件下插入 fscanf

c - 如何获取存储为字符的字符串的长度