2011-10-29 84 views
3

首先,我是C的新手,並且被拋入一個我必須使用C的程序中。現在我相信我的問題與指針有關,但是當我嘗試打印列表時(以確保我已經將它存儲在正確的順序,我的程序第二次通過循環後崩潰。打印時出現無限循環

這是我插入功能插入的最低時間需要,我相信它是正確的,但還沒有能爲我打印崩潰

void insertProcess(Process& process, Process* &head, Process* curr, Process* prev){ 
curr = head; 
if(head == NULL){ 
    head = &process; 
} 
else{ 
    prev = head; 
    while(process.timeNeeded > curr->timeNeeded){ 
     prev = curr; 
     curr = curr->next; 
    } 
    prev->next = &process; 
    process.next = curr; 
} 
} 

這裏是我的簡單的循環,這應該打印的清單,這將給人一種一個「訪問VIO運行之前幾次測試lation閱讀位置'

while(curr->next != NULL){ 
    printf("%s %i %i %i\n", process.processName, process.arrivalTime,  process.timeNeeded, process.priority); 
    curr = curr->next; 
} 

我很確定錯誤會出現在這些代碼段之一,我將不勝感激任何幫助。

編輯:好,在第一張海報的幫助下,我修復了原始問題,但是現在我在打印時出現了無限循環。我很確定這是因爲我按順序插入,並且從未在最後一項之後設置NULL指針。這看起來是否正確,如果有的話,有什麼方法可以解決嗎?再次感謝

+1

'Process *&head'不合法c。你不能通過引用傳遞。 – Dave

+0

你是用C++編譯器編譯的嗎? – Dave

+0

其實我是,我所熟悉的,以及我們的班級正在做什麼,因爲我們沒有C的知識,也沒有時間學習它。我們使用C的真正原因是我們不會使用C++的面向對象的屬性。而且我知道,當我做這件事時看起來並不正確,但是每次我插入插件時都會重置頭部,如果還有其他方法可以做到這一點,我會很樂意修復它。 – user1019430

回答

2

在你的函數要傳遞一個Process按值,這意味着該功能將在將要函數退出時銷燬Process對象的本地副本。

但是,您的代碼正在鏈接到本地​​副本中,因此一旦您退出該功能,您的鏈接列表正在使用已經銷燬的Process對象。

另一個問題是,當循環搜索插入點時,您不考慮插入過程可能是最後一個的情況,在這種情況下,curr將在循環中變爲NULL。

+0

謝謝你解決了一個問題,我應該看到一個問題。我現在正在打印我插入的最後一個項目的無限循環,但也許我可以找到它的問題。 – user1019430

0

您應該學習如何使用調試器。在Linux上,您應該編譯-g(以獲取編譯器生成的調試信息)和-Wall(以獲取所有警告),並傳遞給gccg++。然後你可以在你的可執行文件上使用gdb調試器。