用空格替换制表符 - 内存问题(快速释放无效的下一个大小)

hal*_*exh 0 c

我试图将带有选项卡的字符串传递给函数,并使用该函数替换每个选项卡,或者使用空格重复制表符.我遇到的问题是内存问题.这是我的代码:

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)时,它可以完美地工作.谁能发现错误?我假设它不在我遗漏的其他代码中(正如评论所说,这在实现之前完美地工作).

谢谢!

sim*_*onc 7

这条线

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)

(这不会引起你的问题,但是值得习惯使用正确的字符串类型)