2014-02-21 87 views
0

我是C初學者,並有內存分配問題。我查看了相關的討論。我應該使用Valgrind,但直到我學習如何使用它,我在這裏發佈問題。使用malloc C中的錯誤:malloc.c:2451:sYSMALLOc「斷言失敗」

以下是我製作的合併排序代碼的鏈接。 http://ideone.com/utEzoq

然而,主要的問題似乎是在以下部分:

void main() 
{ 
    MergeSort(list, 0, n-1) //calling function on pointer to array of integers 
} 

int *MergeSort(int *A, int x, int y) //declaration 
{ 
if(x==y) 
{ 
    return A; 
} 

else 
{ 
    int size=1+y-x; 
    int half=(x+y)/2; 

    MergeSort(A, x, half); 
    MergeSort(A, half+1, y);  


    int *C; 
    C=(int *)malloc(size*sizeof(int)); 
    int j=x; 
    int k=half; 
    int i=0; 


    while((j<=half)||(k<=y))    
    { 
     if(A[j]<=A[k]) 
     { 
      C[i]=A[j]; 
      j++; 
     } 
     else 
     { 
      C[i]=A[k]; 
      k++; 
     } 
     i++; 
    } 


    if(j==(half+1)) 
    { 
     while(i<size) 
     { 
      C[i]=A[k]; 
      i++; 
      k++; 
     } 
    } 
    else if(k==(y+1)) 
    { 
     while(i<size) 
     { 
      C[i]=A[j]; 
      i++; 
      j++; 
     } 
    } 

    return C; 
} 

誤差但是具有不同種的輸入產生。當我輸入一個反向排序和排序的數組時,它按照輸入的順序返回輸出。隨機數字給出malloc「Assertion Failed」錯誤。

幫助將不勝感激。

回答

0

您的問題

void main() 

int main() 

int k=half; 

int k=half+1; 

while((j<=half)||(k<=y)) 

while((j<=half)&&(k<=y)) 

return C; 

for(i=0;i<size;++i){ 
    A[x+i]=C[i]; 
} 
free(C); 
return A; 
+0

爲什麼我需要使主int?我沒有主要返回任何東西。 – Mallika

+0

問題是,當我在兩半上調用MergeSort時,我不在任何地方存儲排序後的半部分。如果我創建了兩個單獨的數組並將它們合併,那將不會被正確調用嗎?我將如何實施就地排序? – Mallika

+0

我做了A = MergeSort(A,x,half); A = MergeSort(A,half + 1,y); 我仍然收到錯誤。例如1 2的輸入給了我1 1; 4 3 2 1給我4 4 4 2。 – Mallika

0

你寫信給那些超出數組的長度在第一while循環C元素,從而可能破壞信息mallocfree內部使用。

整個實現有錯誤。例如,您可以遞歸調用排序函數,並在每次調用時分配輔助內存。你返回分配的緩衝區,但從來沒有做過任何事情,更不用說free了。排序功能不排序,因爲排序的數據(假設)在C,你忽略。你有效地打印出A

編輯:有沒有必要學習 Valgrind。安裝它,用-g編譯你的程序,然後用Valgrind運行你的程序。除了輸出外,您還會收到錯誤和警告消息,明確指出發生何種內存衝突的位置。現在安裝Valgrind並養成使用它的習慣 - 這將爲您節省時間。

+0

我確實列表=歸併(列表,0,N-1)而調用來替換帶有排序數組的未排序數組。是的,我還沒有用過免費的。哦,好吧,我會嘗試一下。在我嘗試了一切之後,會在這裏更新。謝謝! – Mallika

+0

臨時數組'C'只是爲了使合併更容易。在函數結束時,用'for'循環和'C'將'C'複製到'A'的適當範圍。您的索引錯誤發生是因爲您的條件邏輯錯誤,請嘗試使用'(j <= half && k <= y)'而不是'||'作爲while循環的條件;您將處理未在下兩個循環中合併的半數組中的尾隨條目。 –