2017-01-02 79 views
-1

我需要构建一个哈希表,但是我从Valgrind得到了应该在代码中初始化的数组上的错误“使用大小为8的未初始化值” (你可以在HashTable的构造函数中看到)。指针阵列的“使用未初始化的值”错误

这里的类魔术师:

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

这里是一流的哈希表:

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)是谁试图达到的东西的那些在数组中。我的初始化不好?如果是,那为什么?

+0

什么是'used(0)'用于它不是一个成员变量.. ?? 你是否缺少类定义中的东西? – Ajay

+0

'for(int i = 0; i 'i ++' –

回答

1

magiID中有一个可能的罪魁祸首是负值。请注意,C和C++ %运算符的定义应使(a/b * b) + (a % b) == a。如果a是负数,b是正数,那么结果是负数,您可以在数组开始之前索引。

+0

非常感谢您,我还没有看到它..它不会影响结果,而是将代码非常慢 – Yaklefak