我正在为我们必须创建哈希表的作业编写代码。其中一个功能是获取哈希表中的所有键并将其分配给参数给出的char * **(三重指针)。 char * **被假定为空,因此我们必须在函数内为其分配内存以适应所有键。
我遇到的问题是,在我分配内存(并且可能是正确的数量,使用strlen + 1)后,程序崩溃并且valgrind给我一条 无效读取大小的错误消息8 ,以及一堆无条件跳转,最后 进程终止,信号11的默认操作(SIGSEGV)访问不在地址0x0的映射区域内 < /强>
int GetKeys( HashTablePTR hashTablePtr, char ***keysArrayHandle, unsigned int *keyCount )
{
HashTablePTR head;
int counter = 0;
size_t length = 0;
*keyCount = 0;
head = hashTablePtr;
if (NULL == hashTablePtr || 0xDEADBEEF != hashTablePtr[0].sentinel)
{
return(-1);
}
else
{
// Get key count
for (int i = 0; i < (int) head[0].range; i++)
{
hashTablePtr = &(head[i]);
while (NULL != hashTablePtr && NULL != hashTablePtr->key)
{
*keyCount = *keyCount + 1;
hashTablePtr = hashTablePtr->next;
}
}
printf("keyCount: [%d]\n", *keyCount);
}
keysArrayHandle = malloc(sizeof(char **) * (*keyCount));
for(int j = 0; j < (int) head[0].range; j++)
{
hashTablePtr = &(head[j]);
while (NULL != hashTablePtr && NULL != hashTablePtr->key && counter < *keyCount)
{
length = strlen(hashTablePtr->key) + 1;
keysArrayHandle[counter] = malloc(sizeof(char) * length);
printf("%s\n", hashTablePtr->key);
///////SOMETHING IS WRONG WITH THIS LINE UNDERNEATH////////
memcpy(*(keysArrayHandle[counter]), hashTablePtr->key, length);
printf("String copied\n");
counter++;
hashTablePtr = hashTablePtr->next;
}
}
return(0);
}
答案 0 :(得分:0)
keysArrayHandle[counter] = malloc(sizeof(char) * length);
返回指向keysArrayHandle[counter]
的指针
然后,您在memcpy中使用*(keysArrayHandle[counter])
而不是keysArrayHandle[counter]
。
也许你应该
*(keysArrayHandle[counter]) = malloc(sizeof(char) * length);
瓦尔特
答案 1 :(得分:0)
我认为你不应该取消引用那里的指针
something = malloc(size);
memcpy(something, x, size); /* instead of memcpy(*something ... */
另外,检查malloc返回的值