2017-01-02 110 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