You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解老鼠走迷宫问题时触发Segmentation Fault的原因排查及代码问题定位

排查你的老鼠走迷宫段错误问题

先直接点明核心问题:你的rinm函数存在未定义行为,这是触发段错误的直接原因。让我们一步步拆解问题并修复:

1. 函数缺少默认返回值(关键问题)

在rinm函数的最后,当上下左右四个方向都无法找到有效路径时,你的代码没有返回任何值。在C++中,非void类型的函数必须保证所有执行分支都有明确的返回值,否则会触发未定义行为——程序可能崩溃、输出乱码,或是出现你遇到的段错误。

看这段有问题的代码:

if(up||down||right||left) {
    return true;
}
// 这里没有返回语句!

当up、down、right、left全为false时,函数走到此处没有返回值,这是严重的逻辑漏洞。你需要在函数末尾添加:

return false;

2. 起点合法性检查(可选但严谨)

你的代码没有提前检查起点maze[0][0]是否可通行(即值为1)。如果用户输入的迷宫起点本身就是墙(值为0),rinm函数会直接返回false,虽然不会崩溃,但提前检查可以避免不必要的递归调用,让逻辑更严谨。可以在main函数调用rinm之前加上:

if (maze[0][0] == 0) {
    cout << "path does not exist\n";
    return 0;
}

修复后的完整rinm函数

bool rinm(int** maze,int** sol,int n, int x, int y) {
    if(x==n-1 && y==n-1) {
        sol[x][y]=1;
        // 打印路径
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                cout<<sol[i][j]<<" ";
            }
            cout<<endl;
        }
        return true;
    } 
    // 先判断当前位置是否合法(越界/墙)
    if(x<0 || y<0 || x>=n || y>=n || maze[x][y]==0) {
        return false;
    }
    // 标记当前位置为路径的一部分
    sol[x][y]=1;
    // 尝试四个方向的递归
    bool up=rinm(maze,sol,n,x-1,y);
    bool down=rinm(maze,sol,n,x+1,y);
    bool right=rinm(maze,sol,n,x,y+1);
    bool left = rinm(maze,sol,n,x,y-1);
    // 回溯:取消当前位置的路径标记
    sol[x][y]=0;
    // 只要有一个方向找到路径就返回true
    if(up||down||right||left) {
        return true;
    }
    // 所有方向都走不通,返回false
    return false;
}

额外的内存管理建议

虽然不会导致段错误,但你需要在程序结束后释放动态分配的二维数组,避免内存泄漏。在main函数末尾添加:

// 释放maze内存
for (int i = 0; i < n; ++i) {
    delete[] maze[i];
}
delete[] maze;
// 释放sol内存
for (int i = 0; i < n; ++i) {
    delete[] sol[i];
}
delete[] sol;

内容的提问来源于stack exchange,提问作者Bikramjit Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 09:42:29