realloc():strtok 操作中的下一个大小无效
realloc(): invalid next size in strtok operation
在我程序的这一部分中,我试图在 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
增加给定参数的大小。不是这种情况。 (即使这样也没有 space 来终止 \0)
您需要跟踪当前尺寸并相应地增加该尺寸。
例如像这样:
if (cdupAccumulator != NULL) {
newStr = realloc(newStr, strlen(newStr) + strlen(cdupAccumulator) + 2);
strcat(newStr, "/");
strcat(newStr, cdupAccumulator);
}
在我程序的这一部分中,我试图在 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
增加给定参数的大小。不是这种情况。 (即使这样也没有 space 来终止 \0)
您需要跟踪当前尺寸并相应地增加该尺寸。
例如像这样:
if (cdupAccumulator != NULL) {
newStr = realloc(newStr, strlen(newStr) + strlen(cdupAccumulator) + 2);
strcat(newStr, "/");
strcat(newStr, cdupAccumulator);
}