【问题标题】:" Use of uninitialised value" error with an array of pointers带有指针数组的“使用未初始化的值”错误
【发布时间】:2017-05-16 09:13:22
【问题描述】:

我需要构建一个哈希表,但我从 Valgrind 得到错误“使用大小为 8 的未初始化值”,该错误应该在代码中初始化(如您在 HashTable 的构造函数中所见)。

这是魔术师课程:

 class Magician{
  public:
  int magiID;
  Magician(int id) : magiID(id) {}
 };

这里是 HashTable 类:

 class HashTable {
 public:
   int k;//total size of the array
   int mod;
   Magician **array;

   HashTable(int k): k(k) {
     array = new Magician *[k];
     for(int i = 0; i<k; k++) array[i] = NULL; //Initialization of the array
     int mod(k);
     while ((mod%10 == 0)||(mod%2 == 0)) {
       mod--;
     }
     if(mod <= 1) mod = 2;
   }

 ~HashTable(){
   delete[] array;
 }

 int reHash(int x, int i){
   return (x%mod + i);
 }

 void insertElement(Magician* m){
   int id = m->magiID;
   int j = 0;
   while(array[reHash(id, j)%k] != NULL){ //Use of uninitialised value of size 8
      j++;
   }
   array[reHash(id, j)%k] = m; //Use of uninitialised value of size 8
 }

};

有问题的行(在方法 insertElement 中)是那些试图到达数组中的东西的行。我的初始化不好吗?如果是,那为什么?

【问题讨论】:

  • 什么是used(0) 用于它不是成员变量..??你在类定义中遗漏了什么吗?
  • for(int i = 0; i&lt;k; k++) : k++ -> i++

标签: c++ arrays hashtable valgrind


【解决方案1】:

一个可能的罪魁祸首是magiID 中的负值。请注意,C 和 C++ 的 % 运算符是这样定义的,以便 (a / b * b) + (a % b) == a。如果a 为负数且b 为正数,则结果为负数,您可以索引到数组开头之前。

【讨论】:

  • 非常感谢,没看过。。不影响结果,但是代码很慢
猜你喜欢
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多