我试图将带有选项卡的字符串传递给函数,并使用该函数替换每个选项卡,或者使用空格重复制表符.我遇到的问题是内存问题.这是我的代码:
void ConvertToOneSpace(char *dst, char *src) {
int i, j, first_tab = 1;
for(i = 0, j = 0; src[i] != '\0'; 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] = '\0';
}
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("%s\n", 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;
}
Run Code Online (Sandbox Code Playgroud)
我在多个字符串(数百个)上运行PrintComment(),使用随机打印语句来验证一切正常.确实如此,直到看似随机的字符串(我可以告诉它没什么特别的),我得到以下错误:
free(): invalid next size (fast)
Run Code Online (Sandbox Code Playgroud)
我假设它与内存有关,因为当我对它进行valgrind(使用memcheck)时,它可以完美地工作.谁能发现错误?我假设它不在我遗漏的其他代码中(正如评论所说,这在实现之前完美地工作).
谢谢!
这条线
result_notabs = (char *)malloc(sizeof(char) * strlen(result)));
Run Code Online (Sandbox Code Playgroud)
应该
result_notabs = malloc(strlen(result) + 1);
Run Code Online (Sandbox Code Playgroud)
为末尾的空终止符留空间result.没有这个,ConvertToOneSpace写作超越了结束result_notabs.这有不明确的后果,可能包括写入程序其他部分使用的内存.
请注意,我对该行进行了其他一些更改
malloc.这在C中不是必需的,可以掩盖错误sizeof(char)因为这保证是1你还应该注意Elchonon Edelson的评论.
char *aString[4096];
Run Code Online (Sandbox Code Playgroud)
声明一个4096个char 指针的数组.你的代码只需要一个chars 数组
char aString[4096];
Run Code Online (Sandbox Code Playgroud)
(这不会引起你的问题,但是值得习惯使用正确的字符串类型)