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

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

在我的程序的这一部分,我试图模仿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变量并且它没有被传递到下一个命令的问题。

c realloc calloc
1个回答
3
投票

这部分没有多大意义:

             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);
            }
© www.soinside.com 2019 - 2024. All rights reserved.