2014-04-29 67 views
1

我很新的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

你正在寫入超出你分配的範圍(你爲'len'字符分配內存,所以最後可訪問的索引是rev [len-1]',因爲rev從0開始)。 – ccKep

+2

使用calloc(len + 1,sizeof(char)) – imreal

回答

2

您將要覆蓋陣列之外,這裏的界限:

rev[len] = '\0'; 

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

因此造成undefined behaviour。這可能會導致元數據的損壞,導致free()的失敗。另外,don't cast the return of malloc()/calloc() etc。您還應該檢查calloc()是否成功。