【问题标题】:realloc() invalid next size - AGAIN, I knowrealloc() 下一个大小无效 - 再次,我知道
【发布时间】:2020-07-24 20:14:06
【问题描述】:

是的,这又是这些问题之一,我知道互联网上充斥着这个特定问题,但我在其他线程中找不到该问题的解决方案,所以我在这里。

我在这段代码中遇到“realloc() invalid next size”错误,它解析一些文本并将单个单词放入字符串数组 argv 中。这段代码非常简单,要让这段代码更好,还有很多工作要做,我完全清楚这一点。

无论如何,当我超过 char **argv 变量的重新分配量时,我会收到此错误。有趣的是,它取决于我运行它的软件。例如,使用 CLion,当我尝试解析 5 个单词的文本时出现此错误,而在 Visual Studio 中,当我收到此错误时,它是 3 个单词的文本。

所以这里是代码,它有3个参数,第一个是一个字符串,一个文本所在的缓冲区。接下来的 2 个参数分别通过引用传递,argc 和 argv。

这是对函数的调用:

char **argv = NULL;
int argc = 0;
//buffer is a string terminated with a zero

parse_line(buffer, &arc, &argv);

这是函数:

int parse_line(char *buffer, int *argc, char ***argv) {

int arg_cap = 10;

*argv = malloc(sizeof(char*));
(*argv)[0] = malloc(arg_cap);

int index_iter = 0;


for (int i = 0; buffer[i]; i++) {
    if (buffer[i] == ' ') {

        (*argv)[*argc][index_iter] = 0;
        (*argv)[*argc] = realloc((*argv)[*argc], index_iter+1);

        index_iter = 0;
        arg_cap = 10;

        (*argc)++;
        *argv = realloc(*argv, sizeof(char*) * (*argc));

        (*argv)[*argc] = malloc(arg_cap);
    }

    else {
        index_iter++;

        if (index_iter >= arg_cap) {
            arg_cap *= 2;
            (*argv)[*argc] = realloc((*argv)[*argc], arg_cap);
        }

        (*argv)[*argc][index_iter-1] = buffer[i];
    }

}

(*argv)[*argc][index_iter] = 0;
(*argv)[*argc] = realloc((*argv)[*argc], index_iter+1);
(*argc)++;

return 1;
}

我希望你能找出问题所在。谢谢各位。

【问题讨论】:

  • 啊,三星级程序员。
  • “此代码中的错误” - 您可以通过在调试器中运行它显着缩小完成的范围,这应该会触发调试中断debug-realloc 实现中的失败断言。您的argv 参与了三个不同的潜在realloc 调用;帮助我们帮助你。
  • int *argc_ptrchar ***argv_ptr作为参数传递,然后将它们分配给局部变量int argcchar **argv,在你的函数中使用它们会更清晰、更有效在返回之前将它们分配回去。
  • @EOF 你的选择是什么?

标签: c allocation realloc


【解决方案1】:

行:

    *argv = realloc(*argv, sizeof(char*) * (*argc));

应该是:

    *argv = realloc(*argv, sizeof(char*) * (1 + *argc));

插入第一个参数并增加*argc 后,您的代码将realloc 数组只保存一个指针,而您现在需要两个。

【讨论】:

  • 哦,我太笨了。谢谢,这就是问题所在。我想知道我是应该保留这个帖子还是删除它,因为我认为这对除了我之外的任何人都没有帮助。我是这个论坛的新手,所以我不知道我应该做什么。
猜你喜欢
  • 2020-12-27
  • 1970-01-01
  • 2014-10-13
  • 2015-01-22
  • 1970-01-01
  • 2019-08-29
  • 2016-03-19
相关资源
最近更新 更多