realloc (): неверный следующий размер в операции strtok - PullRequest
0 голосов
/ 03 апреля 2019

в этой части моей программы я пытаюсь имитировать операцию CDUP на FTP-серверах. Сначала я получаю текущий каталог, в котором находится клиент (ptr2 и buf3), а затем пытаюсь удалить последнюю строку, отделенную /, чтобы определить, каким будет путь, если мы перейдем в каталог. Однако я получаю ошибку realloc только тогда, когда захожу в другой каталог, возвращаюсь и пытаюсь снова выполнить CDUP (т. Е. Идти вверх из корневого каталога)

                char *ptr2;
                char buf3[255];
                // Get current directory of application, store in buf3
                if ((ptr2 = getcwd(buf3, sizeof(buf3))) != NULL) {
                    printf("Current working dir CDUP: %s\n", buf3);
                } else {
                    perror("getcwd() error");
                }

                // Strip current directory off buf3 
                char *cdupSplit = strtok(buf3, "/");
                char *cdupAccumulator = NULL;
                char *newStr = calloc(1, strlen(cdupSplit));
                while (cdupSplit != NULL) {
                    if (cdupAccumulator != NULL) {
                        newStr = realloc(newStr, strlen("/"));
                        newStr = realloc(newStr, strlen(cdupAccumulator));
                        strcat(newStr, "/");
                        strcat(newStr, cdupAccumulator);
                    }
                    cdupAccumulator = cdupSplit;
                    cdupSplit = strtok(NULL, "/");
                }
                ...
                free(newStr);

Ошибка говорит realloc(): invalid next size: 0x0000000001ac0a20 ***

Я не уверен, в чем дело, поскольку я освобождаю переменную newStr, и она не передается в следующий выпуск команды.

1 Ответ

3 голосов
/ 03 апреля 2019

Эта часть не имеет особого смысла:

             if (cdupAccumulator != NULL) {
                    newStr = realloc(newStr, strlen("/"));
                    newStr = realloc(newStr, strlen(cdupAccumulator));
                    strcat(newStr, "/");
                    strcat(newStr, cdupAccumulator);
                }

Вы продолжаете добавлять новый материал в строку, но изменяете его размер снова и снова, чтобы сохранить только последнюю часть.

Вы, кажется,Предположим, что realloc увеличивает размер данного параметра.Это не вариант.(Даже тогда нет места для завершения \ 0). Вам нужно отслеживать текущий размер и соответственно добавлять к этому размеру.

Например, вот так:

if (cdupAccumulator != NULL) {
                newStr = realloc(newStr, strlen(newStr) + strlen(cdupAccumulator) + 2);
                strcat(newStr, "/");
                strcat(newStr, cdupAccumulator);
            }
...