realloc()无效的下一个大小-再一次,我知道

问题描述 投票:3回答:1

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

我在此代码中收到“ realloc()无效的下一个大小”错误,该错误分析了一些文本并将各个单词放入字符串数组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;
}

我希望您能找出问题所在。谢谢你们。

c allocation realloc
1个回答
1
投票

行:

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

应该是:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.