C -条带,char***崩溃



我正在为一个分配代码,我们必须创建一个哈希表。其中一个函数是获取哈希表中的所有键并将其分配给参数给定的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("%sn", hashTablePtr->key);
        ///////SOMETHING IS WRONG WITH THIS LINE UNDERNEATH////////
        memcpy(*(keysArrayHandle[counter]), hashTablePtr->key, length);
        printf("String copiedn");
        counter++;
        hashTablePtr = hashTablePtr->next;
    }
}
return(0);

}

keysArrayHandle[counter] = malloc(sizeof(char) * length);

返回指向keysArrayHandle[counter]的指针。
那么您在memcpy中使用*(keysArrayHandle[counter])而不是keysArrayHandle[counter]

也许你应该

*(keysArrayHandle[counter]) = malloc(sizeof(char) * length);

瓦尔特

我认为你不应该取消对指针的引用

  something = malloc(size);
  memcpy(something, x, size); /* instead of memcpy(*something ... */

同时,检查malloc

返回的值

最新更新