2013-03-02 48 views
0

我對C有點新,我想寫一個簡單的蛇重拍。 您可以在github上查看源代碼:https://github.com/blackwolf12333/Snakesegfault可能是因爲指針問題

構建時,輸出中沒有警告或錯誤。但是,當我運行可執行文件並按下「Segmentation fault(核心轉儲)」命令進入退出程序時。 我不是一個專業的指針,我來自java,當用谷歌搜索時,我發現它可能是一個指針問題。

我不知道哪裏出問題了,因爲據我所知,我正在做的事情是正確的。問題是當我試圖通過我的蛇的body_part的循環。

void print_snake() { 
     int i; 
     body_part *next = main_snake.head.next; 

     move(main_snake.head.pos.x, main_snake.head.pos.y); 
     addch('$'); 
     for(i = 0; i < main_snake.length; i++) { //TODO: segfaults when 'main_snake.length'(should be this) instead of 'main_snake.length - 1' 
      printf("1 part"); 
      print_body_part(next); 
      next = next->next; 
     } 
    } 

這是來自存儲庫中的snake.c文件。

我希望你們能幫助我, 問候blackwolf12333

回答

0

如果你想遍歷鏈表,不要使用單獨的停止條件。您的i變量和main_snake.length是沒有必要的。您可以更換

for(i = 0; i < main_snake.length; i++) 

body_part *next; 
for(next = main_snake.head.next; next->next != NULL; next=next->next){ 
    ... 
} 
+0

我明天會嘗試第一件事:) – blackwolf12333 2013-03-02 23:42:36

1

之前通過代碼深會很明顯,當next變成零和next->next原因分段錯誤。

在循環中,您從頭部旁邊的節點開始(main_snake.head.next)。因此,在4個對象的列表中,您只處理3個對象。在這種情況下,迭代應該是3而不是4,因爲main_snake.length也會按照函數initialize_snake中所示的方式對頭進行計數。這就是你遇到分段錯誤的原因。

+0

我意識到這一點,但不應該發生,因爲長度不應該比未來的 – blackwolf12333 2013-03-02 22:50:21

+0

量較大的讓我檢查一下如果是這樣的問題,會真的很愚蠢:P – blackwolf12333 2013-03-02 22:54:06

+0

我也將頭部計算在內,所以4的長度應該是正確的。還推了一個新的提交... – blackwolf12333 2013-03-02 23:02:29