指针数组的“使用未初始化的值”错误
" Use of uninitialised value" error with an array of pointers
我需要构建一个散列 table 但我从 Valgrind 得到错误 "Use of uninitialised value of size 8" 在一个应该在代码中初始化的数组上(正如您在 HashTable 的构造函数中看到的那样)。
这是class魔术师:
class Magician{
public:
int magiID;
Magician(int id) : magiID(id) {}
};
这是 class 哈希表:
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 中)是那些试图访问数组中的内容的行。我的初始化不好吗?如果是,那为什么?
一个可能的罪魁祸首是 magiID
中的负值。请注意,C 和 C++ %
运算符被定义为 (a / b * b) + (a % b) == a
。如果 a
为负且 b
为正,则结果为负,您可以索引到数组开头之前。
我需要构建一个散列 table 但我从 Valgrind 得到错误 "Use of uninitialised value of size 8" 在一个应该在代码中初始化的数组上(正如您在 HashTable 的构造函数中看到的那样)。
这是class魔术师:
class Magician{
public:
int magiID;
Magician(int id) : magiID(id) {}
};
这是 class 哈希表:
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 中)是那些试图访问数组中的内容的行。我的初始化不好吗?如果是,那为什么?
一个可能的罪魁祸首是 magiID
中的负值。请注意,C 和 C++ %
运算符被定义为 (a / b * b) + (a % b) == a
。如果 a
为负且 b
为正,则结果为负,您可以索引到数组开头之前。