使用free()时“检测到堆损坏”

时间:2014-04-29 21:17:47

标签: c free calloc

我对C很新(这实际上是我第一次使用指针),我无法弄清楚这个错误......

这是我的代码:

void str_rv(char c[]) {
    int i, len = str_ln(c);
    char *rev = (char*)calloc(len, sizeof(char));

    check_mem(rev);

    for (i = 0; i < len; ++i) {
        rev[i] = c[len - (i + 1)];
    }

    rev[len] = '\0';
    str_cpy(rev, c);

    printf("Current string is ");
    str_print(c);
    putchar('\n');
    free(rev);
}

在这个函数中,我试图反转我从sacnf()获得的字符串。 当我调试它时,它运行正常,直到我使用free()的最后一行。我在线阅读了一下,我确信这是我试图消除这种记忆的唯一地方。

帮助?

2 个答案:

答案 0 :(得分:3)

你在这里覆盖超出数组的范围:

rev[len] = '\0';

您只分配了len个字符。相反,您可以分配len +1字符。

因此导致 undefined behaviour 。这可能导致元数据损坏,导致free()失败。

此外,don't cast the return of malloc()/calloc() etc。您还应该检查calloc()是否成功。

答案 1 :(得分:0)

为len分配索引时,索引从0到len-1开始 因此,您必须为其分配len +1,以便可以将索引len用于NULL