reallo c () неверный следующий размер - СНОВА, я знаю - PullRequest
3 голосов
/ 12 апреля 2020

Да, это опять один из этих вопросов, я знаю, что Inte rnet наводнен именно этой проблемой, но я не смог найти решение этой проблемы в других темах, так что я здесь.

Я получаю ошибку "reallo c () неверный следующий размер" в этом коде, который анализирует некоторый текст и помещает отдельные слова в массив строк, argv. Этот код очень прост, и есть еще много чего сделать, чтобы сделать этот код лучше, я полностью осознаю это.

В любом случае, я получаю эту ошибку, когда превышаю некоторое перераспределение переменной char ** argv. Как ни странно, это зависит от программного обеспечения, в котором я его запускаю. Например, при использовании CLion я получаю эту ошибку, когда пытаюсь проанализировать текст из 5 слов, а в Visual Studio - это текст из 3 слов, когда я получаю эту ошибку.

Итак, вот код, он принимает 3 параметра, первый - строка, буфер, в котором находится текст. Следующие 2 параметра передаются по ссылке, arg c и 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;
}

Надеюсь, вы сможете понять, в чем проблема. Спасибо, ребята.

1 Ответ

1 голос
/ 12 апреля 2020

Строка:

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

Должна быть:

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

После вставки первого аргумента и увеличения *argc ваш код будет realloc массив для хранения только одного указателя, когда вам нужно два.

...