【问题标题】:Runtime error in line 25: Char 35: runtime error: member access within null pointer of type 'struct HASH_TABLE' (solution.c)第 25 行中的运行时错误:字符 35:运行时错误:“struct HASH_TABLE”类型的空指针内的成员访问(solution.c)
【发布时间】:2023-03-15 13:02:01
【问题描述】:
#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] 输出:真

请帮我解决我的错误

谢谢

【问题讨论】:

  • malloc(sizeof(HASH_TABLE*))malloc(sizeof(HASH_TABLE))
  • 您为指向某个结构的指针分配了内存,而不是为一个结构分配了内存。
  • 很难看出哪个是你的错误,如果你只发布一个sn-p代码(不是一个完整的例子)并且你没有说什么是预期的(并且没有看到)你执行的输出。请编辑您的帖子以说明这两件事并使用最少的代码来显示完整的运行。只是一个 sn-p,您对正在发生的事情的解释(通常是错误的)总是没有用的。谢谢!

标签: c hashtable


【解决方案1】:

您的代码中有几个错误:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多