2011-10-14 19 views
0

對於我正在處理的程序,我有一個雙向鏈接列表。我現在必須找出一個特定的節點,其中一個特定的數據(稱爲id)變爲負數,然後解引用下面的節點並釋放內存。當我調用這個函數(粘貼在下面)時,最後的打印語句被執行並在屏幕上打印。但是該程序不會返回到main。它只是掛起。 (在這個函數調用之後,我有另一個不能執行的打印語句,程序不停地掛在那裏)。鏈接列表C代碼掛起而沒有從「釋放」函數返回

static void clear_ghosts(particles *plist) 
{ 
    particles * temp = plist; 

    while(temp!=NULL) { 
     if(temp->p->id < 0) 
     { 
      break; 
     } 
    temp = temp->next; 

} 

if(temp) 
{ 
    particles * current = temp; 
    particles * next; 
    while(current !=NULL) 
    { 
     next = current->next; 
     free(current); 
     current = next; 
    } 
    temp = NULL; 
} 

printf("\n Finished Clearing \n"); 
return; 

} 

這裏pliststruct particle *類型的鏈接列表。 plist有數據p,它本身是一個結構,並有像id等成員數據。我需要遍歷列表並終止列表時遇到成員id爲負面的列表。我得到的輸出「Finished Clearing」,但函數沒有返回到main。

可能會出現什麼問題?

+3

郵政主代碼,它出現的問題可能是在那裏。 –

+0

你怎麼知道它沒有回到main? –

+0

如果它真的雙重鏈接,你應該對'prev'字段做些什麼。 – glglgl

回答

0

您確定您嘗試free()的所有元素已分配到malloc()嗎?例如,如果其中一些指針指向堆棧中的內存,那麼當您嘗試使用它們時可能會發生各種可怕的事情。

0

既然你說了一個雙鏈表,你應該上一個元素的下一指針設置爲NULL:

if (temp) 
{ 
    if (temp != plist) 
    { 
    temp->prev->next = NULL; 
    } 
...