“realloc():在多次成功运行后无效的下一个大小”

时间:2017-02-01 22:22:32

标签: c arrays pointers memory realloc

在数组已经存储了来自用户输入的多行后,我一直收到此错误,这告诉我由于该行可能已损坏内存:

    poemArray = (char **)realloc(poemArray, count + 1);

知道我做错了什么吗?非常感谢特定的解决方案!

    line = (char *)malloc(MaxLineLen);

    fgets(line, MaxLineLen, stdin);
    /*Get current line from user input*/
    if(count == 0)
    {
        poemArray = malloc(sizeof(char *));
        printf("1\n");
    }
    if(line[0]  == '.'){
        break;
    }
    line = (char *)realloc(line, strlen(line));

    printf("2\n");

    if(count != 0)
    {
        poemArray = (char **)realloc(poemArray, count + 1);
    }
    poemArray[count] = line;

    ++count;

1 个答案:

答案 0 :(得分:2)

poemArray = (char **)realloc(poemArray, count + 1);

应该是

poemArray = realloc(poemArray, (count + 1) * sizeof(char *));

另外,这个

line = (char *)realloc(line, strlen(line));

应该是

line = realloc(line, strlen(line) + 1);

在潜在malloc之前,还不清楚为什么要对poemArray 进行初始break。{这样你可能最终得到poemArray作为未初始化的大小为1的数组。将它取消初始化是什么意思?

此外,请注意realloc旨在正确处理空指针作为其第一个参数。在这种情况下,realloc基本上等同于malloc。通过利用realloc的这一特性,您可以消除count == 0状态的专用处理,从而最终获得更紧凑和优雅的代码。

P.S。为什么有些malloc的来电包括明确的演员,而其他人则不知道?无论如何,在C中包含内存分配函数的结果是没有意义的。