2017-10-20 61 views
-2

每當我運行此循環時,在循環的第二次迭代中出現分段錯誤。在排序鏈表時出現分段錯誤

node *new,*new1; 

new=(node*) malloc(sizeof(node)); 
new1=(node*) malloc(sizeof(node)); 
new = start->next; 

for(;new->next != NULL;new = new->next) 
{ 
    for(new1=new->next;new1 != NULL;new1=new1->next) 
    { //printf("LOOP\n"); 
     if(new->data > new1->data) 
     { 
      printf("\n Swapping - new:%d and new1:%d\n",new->data,new1->data); 
      temp = (node*) malloc(sizeof(node)); 
      temp1 = (node*) malloc(sizeof(node)); 
      temp1 = new->next; 
      temp = new1->next; 
      new->next = temp; 
      printf("Temp var : %d\n",temp->data); 
      printf("Temp1 var : %d\n",temp1->data); 
      new1->next = new; 

      new1 = new; 
      new = temp1; 
      printf("After swapping , new:%d and new1 : %d\n",new->data,new1->data); 
      //  free(temp); 
      //  free(temp1); 
     } 
    } 
} 

每當我給它一個列表 - 例如, 4,1,9,6 它只交換4和1,當它是迭代交換9和6時,它顯示和分段錯誤。

+4

我建議您花些時間閱讀[如何調試小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs /),並學習如何使用調試器來捕獲像這樣的崩潰。這至少可以幫助你找到崩潰發生的代碼。下一步是在調試器中逐行執行代碼,找出*爲什麼會發生。最有可能是你沒有正確更新的指針,或者根本沒有初始化。 –

+0

可能是不相關的,但是你泄漏內存('temp'和'temp1'有兩個'malloc') – UnholySheep

+2

說到指針,'new = start-> next;'會導致內存泄漏。你首先讓'new'指向某個內存,然後你指向某個* other *內存,失去原來的指針。我也推薦你閱讀[這個老問題和它的答案],(關於'malloc'的結果的投射)(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 –

回答

0

執行temp = new1->next;後,如果new1是列表的最後一個節點,則temp可能爲NULL。雖然tempNULL,但當您在此行中訪問該字段時會引發段錯誤printf("Temp var : %d\n",temp->data);

+0

正是我需要的。知道,謝謝。 – Aditya