将动态分配的结构数组的成员元素初始化为零

时间:2016-12-07 22:06:14

标签: c

我已经浏览了一下但是还没有找到这个问题的答案。我正在尝试创建一个哈希表,其中每个元素都是一个结构。在每个结构中都有一个变量,让程序知道单元格是否已被占用,为此,我需要将它们全部设置为零。事情是它工作正常,但偶尔(看似随机)我会得到一个访问冲突。我以为我修好了它但是当我来扩展我的阵列时,错误再次出现,让我相信我犯了一个错误。我的指针知识根本不是那么好,所以任何帮助都会受到赞赏。这就是函数的样子:

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。

感谢您的帮助。

1 个答案:

答案 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;
}