我试图将一个带有制表符的字符串传递给一个函数,并让函数替换每个制表符,或用空格重复制表符。我遇到的问题是关于记忆问题。下面是我的代码:
void ConvertToOneSpace(char *dst, char *src) {
int i, j, first_tab = 1;
for(i = 0, j = 0; src[i] != ' '; i++) {
if (src[i] == 't' && first_tab == 0) continue;
if (src[i] == 't' && first_tab == 1) {
first_tab = 0;
dst[j] = ' ';
} else {
first_tab = 1;
dst[j] = src[j];
}
j++;
}
dst[j] = ' ';
}
int PrintComment(char *desc) {
char aString[4096];
char *result = NULL;
strcpy(aString, desc);
result = strtok(aString, "n");
while(result != NULL) {
result_notabs = (char *)malloc(sizeof(char) * strlen(result)));
ConvertToOneSpace(result_notabs, result);
printf("%sn", result_notabs);
/* Code that operates on result_notabs, splitting it into multiple sub
strings of shorter length. This code was tested working perfectly
before implementing and utilizing ConvertToOneSpace */
free(result_notabs);
}
return 0;
}
我对多个字符串(数百个)运行PrintComment(),使用随机打印语句来验证一切正常工作。它确实这样做了,直到出现一个随机字符串(我可以告诉它没有什么特别的),并且我得到以下错误:
free(): invalid next size (fast)
我假设它是内存相关的,因为当我valgrind它(与memcheck),它工作得很好。有人能发现这个错误吗?我假设它不在我遗漏的其他代码中(正如评论所说,在实现这一点之前,它是完美工作的)。
谢谢!
result_notabs = (char *)malloc(sizeof(char) * strlen(result)));
应该result_notabs = malloc(strlen(result) + 1);
在result
的末尾为空终止符留下空间。如果没有这个,ConvertToOneSpace
的写入将超出result_notabs
的末尾。这将导致未定义的结果,可能包括写入程序其他部分使用的内存。
注意,我对那行
做了一些其他的修改- 从
malloc
的返回中移除cast。这在C中是不需要的,可以掩盖错误 - 删除了
sizeof(char)
的使用,因为它保证为1
你还应该注意Elchonon Edelson的评论。
char *aString[4096];
声明一个包含4096个char
指针的数组。你的代码只需要一个 char
s数组而不是
char aString[4096];
(这不会导致您的问题,但值得养成使用正确字符串类型的习惯)
使用result_notabs = (char *)malloc(sizeof(char) * (strlen(result)+1)));
代替result_notabs = (char *)malloc(sizeof(char) * strlen(result)));
在这里,结束null字符的字符串长度额外增加了1。