【问题标题】:C - strpy, char*** crashingC - strpy, char*** 崩溃
【发布时间】:2014-03-22 02:54:38
【问题描述】:

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

我遇到的问题是,在我分配内存(并且可能是正确的数量,使用 strlen + 1)之后,程序崩溃并且 valgrind 给我一个错误消息 invalid read of size 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);

}

【问题讨论】:

  • 你知道keysArrayHandle应该是一个out参数,对吧?像所有输出参数一样,它是由 address 传递的。因此,您最好在这里的某个地方这样做:*keysArrayHandle = ....

标签: c crash malloc strcpy


【解决方案1】:
keysArrayHandle[counter] = malloc(sizeof(char) * length);

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

也许你应该

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

变态

【讨论】:

    【解决方案2】:

    我认为您不应该在此处取消引用该指针

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

    另外,检查一下malloc返回的mp值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-28
      • 2013-04-07
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多