segfault可能是因为指针问题

时间:2013-03-02 22:34:59

标签: c pointers

我是C的新手,我正在尝试写一个简单的蛇重拍。 您可以在github上查看源代码:https://github.com/blackwolf12333/Snake

构建时,输出中没有警告或错误。但是,当我运行可执行文件并点击输入时,出现“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

2 个答案:

答案 0 :(得分:1)

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

在循环中,您从头部旁边的节点开始(main_snake.head. next )。因此,在4个对象的列表中,您只处理3个对象。在这种情况下,迭代应该是3而不是4,因为main_snake.length计算头部也如函数initialize_snake所示。这就是你得到分段错误的原因。

答案 1 :(得分: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){
    ...
}
相关问题