0

私はCに少し慣れていないので、簡単なヘビのリメイクを書こうとしています。ソースはgithubで表示できます:https ://github.com/blackwolf12333/Snake

ビルドするとき、出力に警告やエラーはありません。しかし、実行可能ファイルを実行してEnterキーを押すと、「セグメンテーション違反(コアダンプ)」で終了します。私はまだポインターのプロではありません。私は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

4

2 に答える 2

1

nextコードを深く掘り下げる前に、がnullになりnext->next、セグメンテーション違反が発生することは明らかです。

ループでは、head()の隣のノードから開始しますmain_snake.head.next。したがって、4つのオブジェクトのリストでは、3つのオブジェクトのみを処理しています。main_snake.lengthその場合、関数に示されているようにヘッドもカウントするため、反復は4ではなく3にする必要がありますinitialize_snake。これが、セグメンテーション違反が発生している理由です。

于 2013-03-02T22:49:24.063 に答える
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){
    ...
}
于 2013-03-02T23:34:39.203 に答える