我是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
答案 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){
...
}