2016-09-20 117 views
-4

上的內存損壞(快)錯誤所以我一直在使用合併排序方法,它使用泛型類型作爲輸入並對它們進行排序。我收到一個我不明白的錯誤。因爲我使用泛型類型並需要對20 kk記錄進行排序,所以我必須使用malloc函數來分配用於實現合併排序的數組,因此需要在不需要時立即釋放它們以避免填滿我所有的記憶。下面是代碼(我只會把相關代碼段):C,免費()

代碼

void merge(void ** A, int a, void ** B, int b, void ** C , CompFunction compare) 
{ 

    int i,j,k; 
    i=0; 
    j=0; 
    k=0; 
    while(i < a && j < b){ 
     if((compare(A[i],B[j])<0)){ 
      C[k++] = A[i++]; 
     } 
     else{ 
      C[k++] = B[j++]; 

     } 

    } 
    while(i < a){ 
     C[k++] = A[i++]; 
    } 
    while(j < b){ 
     C[k++] = B[j++]; 
    } 


} 
    void merge_sort(void** A, int n, CompFunction compare) 
{ 
int i; 
    void ** A1; 
    void ** A2; 
    int n1,n2; 
    if(n < 2)return; 
    n1 = n/2; 
    n2 = n - n1; 
    A1 = malloc(sizeof(sizeof(void*))*n1); 
    A2 = malloc(sizeof(sizeof(void*))*n2); 
    printf("i:%d\n",i); 
    for(i = 0 ; i < n2 ; i++){ 
     A1[i] = A[i]; 
    } 
    for(i = 0 ; i < n2 ; i++){ 
     A2[i] = A[i+n1]; 
    }  
    merge_sort(A1, n1, compare); 
    merge_sort(A2 ,n2, compare); 
    merge(A1, n1, A2, n2, A, compare); 
    free(A1); 
    free(A2); 
} 

你會看到我在打電話的功能參數的比較功能。這只是一種比較各種類型的數據以確定哪個更大或更小的功能。 我試圖刪除free()和錯誤不再顯示,但代碼永遠不會結束運行,因爲它填滿了硬盤上的所有內存和交換區域。 我得到的錯誤是這樣的:

錯誤

*** Error in `./exeInt': malloc(): memory corruption  
(fast):0x00000000006dffa0 *** 

如果有人能幫助我,我會深深appreaciate它。

+0

聞起來像一個錯誤。 –

+1

請顯示[MCVE]。 –

+0

for A [1]必須運行到n1 –

回答

1
A1 = malloc(sizeof(sizeof(void*))*n1); 

這是你的問題,讓我們先評估一下sizeof(void *),即8字節(在64位系統中)。那麼你可以用n1乘以它,這是一個int,這會導致結果評估爲一個int,因此你得到4個字節* n1而不是8個字節,就像我想要的那樣。

+3

sizeof returns size_t – stark

+0

@monkeyStix你的報價說「整數常量」,而不是「int」。 –

+0

謝謝,就是這樣。其實我不知道爲什麼我會這麼做,我只需要sizeof(void *)* n1。再次感謝你:) – SkullMonkey

0

我不認爲這是問題,但至少有一個問題是:

for(i = 0 ; i < n2 ; i++){ 
    A1[i] = A[i]; 
} 
for(i = 0 ; i < n2 ; i++){ 
    A2[i] = A[i+n1]; 
} 

第一個for循環應該是(...; i < n1;...)。這可能是你溢出陣列。

另外,正如其他人所提到的,您沒有檢查返回值malloc,但這不是問題。請注意,malloc失敗時將返回NULL

+0

謝謝你的考慮,但它似乎是其他問題:) – SkullMonkey