我环顾四周,但还没有找到这个问题的答案。我正在尝试创建一个哈希表,其中每个元素都是一个结构。在每个结构中都有一个变量让程序知道单元格是否已被占用,为此我需要将它们全部设置为零。问题是它工作正常但有时(看似随机)我会遇到访问冲突。我以为我修复了它,但是当我开始增加我的数组时,错误再次出现,让我相信我犯了一个错误。我的指针知识一点也不好,所以任何帮助将不胜感激。这是函数的样子:
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 循环的每次迭代中移动正确数量的空格。当我调整大小时,我只是创建了一个新数组,其空间是分配空间的两倍,并将其传递给初始化函数,但这会在看似随机的索引处引发访问冲突错误。
如果有帮助,我正在使用 VS2015。
感谢您的帮助。
最佳答案
问题出在这一行:
*hashTable = *(tempStartingcell + (i * sizeof(HashTableCell)));
当您向指针添加一个整数时,C 和 C++ 已经考虑了数组元素的大小,因此您不应与 sizeof(HashTableCell) 相乘,而应该这样做:
*hashTable = *(tempStartingcell + i);
否则,您的额外乘法将导致在 tempStartingCell
数组之外进行访问。这样写更有意义:
*hashTable = tempStartingcell[i];
但是你的代码还有更多的错误;如果您只想将 hashTable
中的每个元素的 isOccupied
设置为零,只需执行以下操作:
void initialiseTable(HashTableCell *hashTable, int tableSize)
{
for (int i = 0; i < tableSize; i++)
hashTable[i].isOccupied = 0;
}
关于c - 将动态分配的结构数组的成员元素初始化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41028239/