【问题标题】:Segmentation fault in a maze program in c [duplicate]c中迷宫程序中的分段错误[重复]
【发布时间】:2018-11-08 01:22:11
【问题描述】:

这是一个迷宫解决程序。它应该与包含迷宫的 txt 文件一起运行,格式如下:

5 5
%%%%%
S % %
% % %
%   E
%%%%%

前2个数字应该是迷宫的宽度和高度,'%'应该是墙,'S'是开始,'E'是结束,标记'*'代表解决方案,并标记 '~' 表示尝试但失败的路径。

这是我的solveMazeDFS代码:

int solveMazeDFS(maze_t * maze, int col, int row)
{                 //This is line 102
  if(col < 0 || row < 0 || col >= maze->width || row >= maze->height){
    return 0;
  }
  if(maze->cells[row][col] == '%' || maze->cells[row][col] == '~'){
    return 0;
  }
  if(maze->cells[row][col] == 'E'){
    return 1;
  }
  if(maze->cells[row][col] == ' '){
    maze->cells[row][col] = '*';
  }

  if(solveMazeDFS(maze, col - 1, row) == 1){
    return 1;
  }
  if(solveMazeDFS(maze, col + 1, row) == 1){
    return 1;
  }
  if(solveMazeDFS(maze, col, row - 1) == 1){
    return 1;
  }
  if(solveMazeDFS(maze, col, row + 1) == 1){
    return 1;
  }
  maze->cells[row][col] = '~';
  return 0;
}

我不断收到分段错误。我用 valgrind 运行代码,看看到底哪里出了问题,它告诉我线程 #1 中的堆栈溢出:无法在 0x400AED 将堆栈增长到 0x1ffe801000:solveMazeDFS (maze.c:102) 所以基本上第 102 行是 int solveMazeDFS(maze_t * maze, int col, int row) 之后的左大括号。我是新手,老实说,在这一点上很迷茫。

【问题讨论】:

  • 你可能有无限递归。
  • 在调试器下运行程序,你应该可以看到它是如何递归的以及为什么递归没有结束。
  • 想想你没有在早期检查的情况。
  • 一开始还需要检查*,避免来回走动
  • 以这种方式使用递归不是一个好主意。改用迭代。

标签: c


【解决方案1】:
  if(maze->cells[row][col] == ' '){
    maze->cells[row][col] = '*';
  }

您需要else return 0;。否则,你只能无限地来回走动。如果方格已经被占用了,我们就不能再占用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多