0

我对C有点陌生,我正在尝试编写一个简单的蛇翻版。可以在github上查看源码:https ://github.com/blackwolf12333/Snake

构建时,输出中没有警告或错误。但是,当我运行可执行文件并按 Enter 键时,它会以“Segmentation fault(core dumped)”退出。我还不是指针的专业人士,我来自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

在深入研究代码之前,很明显 whennext变为 null 并next->next导致分段错误。

main_snake.head.next在循环中,您从 head( )旁边的一个节点开始。因此,在 4 个对象的列表中,您只处理 3 个对象。在这种情况下,迭代次数应该是 3 而不是 4,因为main_snake.length计算头部也如函数所示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 回答