0

我正在尝试将带有选项卡的字符串传递给函数,并让函数替换每个选项卡,或者用空格重复选项卡。我遇到的问题是关于内存问题。这是我的代码:

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;
}

我在多个字符串(数百个)上运行 PrintComment(),并使用随机打印语句来验证一切是否正常工作。它确实如此,直到看起来是一个随机字符串(我可以告诉它没什么特别的)并且我收到以下错误:

     free(): invalid next size (fast) 

我假设它与内存有关,因为当我对它进行 valgrind(使用 memcheck)时,它工作得很好。任何人都可以发现错误吗?我假设它不在我遗漏的其他代码中(正如评论所说,在实现它之前它工作得很好)。

谢谢!

4

2 回答 2

7

线

result_notabs = (char *)malloc(sizeof(char) * strlen(result)));

应该

result_notabs = malloc(strlen(result) + 1);

在结尾处为空终止符留出空间result。没有这个,ConvertToOneSpace写入超出result_notabs. 这具有未定义的后果,可能包括写入程序其他部分使用的内存。

请注意,我对该行进行了其他一些更改

  • malloc. 这在 C 中不是必需的,可以掩盖错误
  • 删除了使用,sizeof(char)因为这保证为 1

您还应该注意 Elchonon Edelson 的评论。

char *aString[4096];

char 声明一个包含 4096 个指针的数组。char您的代码只需要一个s数组

char aString[4096];

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

于 2013-05-08T16:03:13.310 回答
0

使用 result_notabs = (char *)malloc(sizeof(char) * (strlen(result)+1)));而不是 result_notabs = (char *)malloc(sizeof(char) * strlen(result))); 在终止空字符的字符串长度中添加额外的 1。

于 2013-05-08T16:12:03.267 回答