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

标签 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 循环的每次迭代中移动正确数量的空格。当我调整大小时,我只是创建了一个新数组,其空间是分配空间的两倍,并将其传递给初始化函数,但这会在看似随机的索引处引发访问冲突错误。

如果有帮助,我正在使用 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/

相关文章:

比较宏定义中的字符串

c - 错误:expected expression else in C

c - 如何从队列中删除集合节点

c++ - Eclipse反汇编 View ,可以在不调试程序的情况下查看反汇编吗?

c - 对于多维数组,第一列中用户输入的值,第二列中显示正方形

c - 管道将一个程序的标准输出重定向到另一个程序的标准输入

c - 为什么我的按钮在使用 C 的 SDL2 中不起作用?

c - 如何在 makefile 中添加相互依赖的库

c - 停止从命令行启动二进制文件

c - kmalloc 分配实际上不是连续的吗?