2014-10-05 50 views
-2

我有以下的C程序,其MALLOC兩名漁政陣列,並且所述自由部分期間它報告Ç免費()在Linux報告無效下一尺寸誤差,陣列指針,相同的代碼通上MAC

*的glibc檢測到* ./a.out:free():無效的下一個尺寸(快速):0x0000000000e05070 ***

帶回溯。

我試着在linux服務器上的相同的代碼,並得到相同的錯誤。但是,相同的代碼在我的朋友的Mac上完美工作。

我想知道這是否是操作系統特定的問題(例如編譯器的差異)? 或者我以不適當的方式做了一些事情,但被mac OS忽略了?

# include <stdlib.h> 

# define N 10 

int main(){ 
    int size = N+1; 

    //memory allocation 
    float **m = malloc((size)*sizeof(float*)); 
    int i; 
    for (i=0; i<size; i++) 
    m[i] = malloc((size)*sizeof(float)); 

    // ... do some work 

    //free 
    for (i=0; i<size; i++){ 
    printf("free: %d", i); 
    free(m[i]); 
    printf(" freed.\n"); 
    } 

    free(m); 
    printf("m freed.\n"); 

    return 0; 
    } 

PS:遊離for循環中,如果使用

for (i=size; i>=0; i--){...} 

而不是增量版本時,它實際上將釋放米[I]下降到2之前相同的錯誤彈出。 Mac沒有出錯。

+0

將'int size'更改爲'const int size'? – 2014-10-05 22:54:27

+0

你在做什麼'做一些工作'部分?你可能會以某種方式溢出數組,從而破壞導致錯誤的緩衝區。例如,請參閱http://stackoverflow.com/questions/23680334/what-is-a-glibc-free-malloc-realloc-invalid-next-size-invalid-pointer-error-and?rq=1 – uesp 2014-10-06 00:23:24

+0

是的,你遺漏了可能導致問題的代碼的每一部分,給出了什麼? – 2014-10-06 00:31:35

回答

1

由於當程序嘗試free()已在堆上分配的所有內存時,glibc發現內存已被無望損壞,因此您正在獲取分段違例。

並且在您的示例中可能發生損壞的唯一部分是您忽略包含在示例中的部分。

因此,答案是錯誤是「// ...做一些工作」。如果您刪除所有代碼,您的示例將運行而不會崩潰。