在我的程序的这一部分,我试图模仿ftp服务器中的CDUP操作。首先,我获取客户端所在的当前目录(ptr2
和buf3
),然后我尝试剥离由/
分隔的最后一个字符串,以确定如果我们上一个目录的路径。但是,只有当我进入另一个目录,回来并再次尝试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
增加了给定参数的大小。不是这种情况。 (即使这样也没有空间来终止\ 0)你需要跟踪当前的大小并相应地增加这个大小。
例如这样:
if (cdupAccumulator != NULL) {
newStr = realloc(newStr, strlen(newStr) + strlen(cdupAccumulator) + 2);
strcat(newStr, "/");
strcat(newStr, cdupAccumulator);
}