用空间内存问题替换Tab(s) (free invalid next size fast)



我试图将一个带有制表符的字符串传递给一个函数,并让函数替换每个制表符,或用空格重复制表符。我遇到的问题是关于记忆问题。下面是我的代码:

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 指针的数组。你的代码只需要一个 chars数组而不是

char aString[4096];

(这不会导致您的问题,但值得养成使用正确字符串类型的习惯)

使用result_notabs = (char *)malloc(sizeof(char) * (strlen(result)+1)));代替result_notabs = (char *)malloc(sizeof(char) * strlen(result)));在这里,结束null字符的字符串长度额外增加了1。

最新更新