释放内存时出错 - C.

时间:2014-06-03 20:03:09

标签: c free

我对此代码有疑问:

 char * findAlphabet(char *string)
{
    char *tmp_alph = (char *)malloc(sizeof(char) * strlen(string));
    char *alphabet = (char *)malloc(sizeof(char) * strlen(string));
    strcpy(tmp_alph, string);
    qsort(tmp_alph, strlen(string) - 1, sizeof(char), strcmp);
    int i = 1, k = 1;
    alphabet[0] = tmp_alph[0];
    for(i = 1; i < strlen(string); ++i)
    {
        if(tmp_alph[i] != tmp_alph[i - 1])
        {
            alphabet[k++] = tmp_alph[i];
        }
    }
    alphabet[k - 1] = tmp_alph[strlen(string) - 1]; //Terminator
    alphabet[k] = '\0';
    free(tmp_alph);
    return alphabet;
}

执行:

char *string = "ABBDDECACDABBDDFCACDAACACABBDDECACDBBCC$\0";

我有以下错误:

malloc(): memory corruption (fast): 0x0000000001a4ed50 ***

使用调试器似乎问题似乎正在执行:

free(tmp_alph);

这段代码出了什么问题?

如果我评论free(tmp_alph),结果似乎是正确的。

1 个答案:

答案 0 :(得分:0)

strlen(string)返回string的长度,忽略终结符\0。为tmp_alph分配空间时,您应该考虑此字符串还必须具有终止符,因此您必须在数组中明确声明其他位置。

char *tmp_alph = (char *) malloc(sizeof(char) * (strlen(string)+1));

我还会在tmp_alph中手动设置终结者字符,以防strcpy自动执行此操作。

tmp_alph[strlen(string)+1] = '\0';