我已经浏览了一下但是还没有找到这个问题的答案。我正在尝试创建一个哈希表,其中每个元素都是一个结构。在每个结构中都有一个变量,让程序知道单元格是否已被占用,为此,我需要将它们全部设置为零。事情是它工作正常,但偶尔(看似随机)我会得到一个访问冲突。我以为我修好了它但是当我来扩展我的阵列时,错误再次出现,让我相信我犯了一个错误。我的指针知识根本不是那么好,所以任何帮助都会受到赞赏。这就是函数的样子:
HashTableCell *initialiseTable(HashTableCell *hashTable, int *tableSizePtr)
{
int i = 0;
int totalSize = *tableSizePtr * sizeof(HashTableCell);
HashTableCell *tempStartingcell;
tempStartingcell = (HashTableCell*)malloc(sizeof(HashTableCell));
*tempStartingcell = *hashTable;
while (i <= *tableSizePtr)
{
/*we keep moving forward, need to use the first entry*/
*hashTable = *(tempStartingcell + (i * sizeof(HashTableCell)));
hashTable->isOccupied = 0;
i++;
}
free(tempStartingcell);
return hashTable;
}
在我为桌子购买一些空间并将其传递给另一个函数之前:
HashTableCell *hashTable;
hashTable = (HashTableCell*)malloc((sizeof(HashTableCell)*tableSize));
hashTable = initialiseTable(hashTable, tableSizePtr);
这个想法是从头开始,沿着while循环的每次迭代移动正确数量的空格。当我调整大小时,我只创建一个新的数组,其中包含malloced空间的两倍并将其传递给初始化函数,但这会在看似随机的索引中引发访问冲突错误。
如果有帮助,我正在使用VS2015。
感谢您的帮助。
答案 0 :(得分:3)
问题出在这一行:
*hashTable = *(tempStartingcell + (i * sizeof(HashTableCell)));
当您向指针添加整数时,C和C ++已经考虑了数组元素的大小,因此您不应该与sizeof(HashTableCell)相乘,而是:
*hashTable = *(tempStartingcell + i);
否则,额外的乘法将导致tempStartingCell
数组之外的访问。这样编写就更有意义了:
*hashTable = tempStartingcell[i];
但是你的代码还有更多错误;如果您只想为isOccupied
中的每个元素设置hashTable
为零,请执行以下操作:
void initialiseTable(HashTableCell *hashTable, int tableSize)
{
for (int i = 0; i < tableSize; i++)
hashTable[i].isOccupied = 0;
}