C++实现老鼠走迷宫触发SEGMENTATION FAULT 求调试指导
老鼠走迷宫代码段错误排查与修复
核心错误点
直接触发段错误的原因有3个,按影响优先级排序:
- 边界检查顺序错误:当前代码进入递归后,先执行
m[i][j]的数组访问,之后才判断i、j是否越界。当递归传入的i/j为负数、等于n时,访问数组越界位置会直接触发内存访问错误,这是段错误的最主要诱因。 - 无已访问节点标记,递归死循环栈溢出:代码没有记录已经走过的迷宫格子,递归时会在相邻两个可走格子之间来回跳转(比如从(0,0)走到(1,0)后又向上走回(0,0)),无限递归会耗尽栈内存,同样触发段错误。
- 字符串回溯逻辑错误:当前代码在每个方向分支外无条件执行
x.pop_back(),如果对应方向的判断不成立、没有向x追加方向字符,pop操作会操作长度不足的字符串,属于未定义行为,可能引发内存错误。另外代码中残留了无匹配开头的*/注释符,会直接触发编译错误。
调试修复方向
按以下顺序修改即可解决问题:
- 调整递归函数内的判断顺序:进入函数第一时间做边界校验,确认i、j都在
[0, n-1]合法区间后,再访问m数组的对应位置。 - 新增和迷宫等大的
visited二维布尔数组,进入某个合法格子后先标记为已访问,当前格子四个方向都递归完成、准备回溯返回前,再把标记清除为未访问,避免重复走同一个格子进入死循环。 - 修正字符串回溯逻辑:每个方向的字符追加、递归调用、pop操作必须绑定在同一个分支内,只有确实追加了字符,递归返回后才执行对应pop,不要在分支外做无条件pop。
- 删除代码中残留的多余
*/符号,修正语法错误。 - 额外注意:递归启动前先判断起点
m[0][0]是否为0,如果起点不可走直接返回{"-1"}即可,不需要进入递归。
修正后的核心递归逻辑参考
class Solution{ public: string x=""; void rat(vector<vector<int>>&m,int n,vector<string>&ans,int i,int j, vector<vector<bool>>& visited) { // 最先执行边界校验,禁止越界访问 if(i<0 || j<0 || i>=n || j>=n) return; // 校验当前格子是否可走、是否已经访问过 if(m[i][j] == 0 || visited[i][j]) return; // 到达终点,存储路径 if(i == n-1 && j == n-1) { ans.push_back(x); return; } // 标记当前格子已访问 visited[i][j] = true; // 向下探索 x.push_back('D'); rat(m, n, ans, i+1, j, visited); x.pop_back(); // 向右探索 x.push_back('R'); rat(m, n, ans, i, j+1, visited); x.pop_back(); // 向上探索 x.push_back('U'); rat(m, n, ans, i-1, j, visited); x.pop_back(); // 向左探索 x.push_back('L'); rat(m, n, ans, i, j-1, visited); x.pop_back(); // 回溯:清除当前格子的访问标记 visited[i][j] = false; } vector<string> findPath(vector<vector<int>> &m, int n) { vector<string> ans; // 起点不可走直接返回 if(m[0][0] == 0) return {"-1"}; vector<vector<bool>> visited(n, vector<bool>(n, false)); rat(m, n, ans, 0, 0, visited); if(ans.empty()) return {"-1"}; return ans; } };
内容的提问来源于stack exchange,提问作者19ECE1012 Grishma Karekar
相关产品推荐
相关产品推荐

