首页 文章

C - strpy,char ***崩溃

提问于
浏览
-1

我正在为我们必须创建哈希表的作业编写代码 . 其中一个功能是获取哈希表中的所有键并将其分配给参数给出的char * **(三重指针) . char * **被假定为空,因此我们必须在函数内为其分配内存以适应所有键 .

我遇到的问题是,在我分配内存(并且可能是正确的数量,使用strlen 1)之后,程序崩溃并且valgrind给出了 invalid read of size 8 的错误消息,以及一堆无条件跳转,最后是 Process terminating with default action of signal 11 (SIGSEGV) Access not within mapped region at address 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);

}

2 回答

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

    返回指向 keysArrayHandle[counter] 的指针 .
    然后你在memcpy中使用 *(keysArrayHandle[counter]) 而不是 keysArrayHandle[counter] .

    也许你应该

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

    瓦尔特

  • 0

    我认为你不应该在那里取消引用那个指针

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

    另外,检查malloc返回的值

相关问题