realloc():strtok 操作中的下一个大小无效

realloc(): invalid next size in strtok operation

在我程序的这一部分中,我试图在 ftp 服务器中模仿 CDUP 操作。首先,我获取客户端所在的当前目录(ptr2buf3),然后我尝试剥离由 / 分隔的最后一个字符串以确定路径是什么我们上了一个目录。但是,只有当我进入另一个目录,返回并再次尝试 CDUP(即从根目录向上)时,我才会收到 realloc 错误

                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 变量,它不会被传递到下一个命令。

这部分意义不大:

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

您不断向字符串中添加新内容,但一次又一次地调整它的大小以仅保留最后一部分。

您似乎假设 realloc 增加给定参数的大小。不是这种情况。 (即使这样也没有 space 来终止 \0) 您需要跟踪当前尺寸并相应地增加该尺寸。

例如像这样:

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