在c++中向哈希表中添加项会产生访问冲突异常

Adding items to hash table in c++ gives access violation exception

本文关键字:访问冲突 异常 添加 c++ 哈希表      更新时间:2023-10-16

我正在尝试创建一组数字的哈希表。我正在用c++进行过程编程。下面是我的代码:

//以下结构体是全局定义的

struct edgePixel{
    int row;
    int col;
    int intensity;
    edgePixel *nextPixel;
};
void Function1 (....other parameters not related to hashtable....){
// Declare and initialize hashtable
edgePixel **edgePixelTable = new edgePixel*[fileCounter];
   for(int i = 0; i<fileCounter; i++){
       edgePixelTable[i] = new edgePixel;
       edgePixelTable[i]->row = -1;
       edgePixelTable[i]->col = -1;
       edgePixelTable[i]->intensity = -1;
       edgePixelTable[i]->nextPixel = NULL;     
    }
    function2(..., index, &edgePixelTable);
}
void function2(..., int index, edgePixel ***edgePixelhistogram){
//Calculations of row, col, intensity and index
//......
//......
    addPixel(row, col, intensity, index, edgePixelhistogram);
}
void addPixel(int row, int col, int intensity, int fileID, edgePixel ***edgePixelTable){
    if (edgePixelTable[fileID][0]->row == -1){ //<--- Access violation happens right here
       edgePixelTable[fileID][0]->row = row;
       edgePixelTable[fileID][0]->col = col;
       edgePixelTable[fileID][0]->intensity = intensity;
       edgePixelTable[fileID][0]->nextPixel = NULL;
    }
    else{
       edgePixel *tempPtr = edgePixelTable[fileID];
       edgePixel *newNode = new edgePixel;
       newNode->row = row;
       newNode->col = col;
       newNode->intensity = intensity;
       newNode->nextPixel = NULL;
       while(tempPtr->nextPixel!=NULL){
          tempPtr = tempPtr->nextPixel;
       }
       tempPtr->nextPixel = newNode;
    }

我真的不知道如何计算为什么以及如何访问冲突错误发生。我在代码的注释中指出了这一点。我在调试程序时遇到了这个问题。此外,我访问数组中的指针元素的方式看起来很奇怪。我觉得我做得不对。我所要做的就是创建一个空指针数组,它实际上是每个索引处链表的头。

你能帮我正确地做这个吗?我很确定我做指针算术错误的地方。非常感谢你的帮助。

edgePixelTable[fileID][0]->row应改为(*edgePixelTable)[fileID]->row

传递表的地址,因此在访问它之前需要对它解引用。这是因为edgePixelTableedgePixel***类型的,并且指向edgePixel**类型的单个元素。当你执行edgePixelTable[fileID]时,你引用的内存实际上是指向。

所以你的seg错误是你的代码有未定义行为的结果。