2017-01-02 10 views
-1

Мне нужно создать хэш-таблицу, но я получаю от Valgrind ошибку «Использование неинициализированного значения размера 8» в массиве, который должен быть инициализирован в коде (как вы можете видеть в конструкторе HashTable).Ошибка «Использовать неинициализированное значение» с массивом указателей

Вот класс Magician:

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) являются те, которые пытаются достичь чего-то в массиве. Неужели моя инициализация плохая? Если да, то почему?

+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