【问题标题】:"realloc(): invalid next size" after multiple successful runs多次成功运行后出现“realloc():下一个大小无效”
【发布时间】:2017-06-18 20:37:12
【问题描述】:

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

    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;

【问题讨论】:

  • 你可能在后面的代码中读到了line 的结尾; realloc(line, strlen(line)) 切断了空终止符,所以后面的代码无法知道何时停止阅读
  • line = (char *)realloc(line, strlen(line)); 是一条毫无意义的行。取已经存在的字符串的长度,然后为它分配空间?呃,什么?
  • 啊,我明白了,你正在减少线路的分配。在这种情况下,您忘记了所有 C 字符串上终止零的 + 1

标签: c arrays pointers memory realloc


【解决方案1】:

这个

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);

也不清楚你为什么要为poemArray 做最初的malloc 潜在的break。这样一来,您最终可能会得到 poemArray 作为大小为 1 的未初始化数组。未初始化它有什么意义?


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

附:为什么对malloc 的某些调用包含显式转换,而其他调用则不包含?无论如何,在 C 中封装内存分配函数的结果是没有意义的。

【讨论】:

  • x = realloc(x, ...); 是一个 99.99% 的错误!
  • @0andriy: x = realloc(x, ...); 绝对是坏代码,就像不检查 malloc 的结果是否为 null 是坏代码一样。但首先要做的事情是:代码目前包含更多明显的问题。
  • 谢谢大家。代码远未完成,所以我仍然需要为空指针添加句柄。我还是 C 的新手,所以如果您在阅读时想哭,我很抱歉,哈哈。干杯
猜你喜欢
  • 2019-08-29
  • 2020-12-27
  • 1970-01-01
  • 2014-10-13
  • 2015-01-22
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多