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

两段相似的DFS遍历代码为何一段出现段错误另一段正常运行?

两段DFS代码段错误差异原因

我编写的第一段DFS代码运行时出现Segmentation Fault(段错误),以下是两段逻辑相似的深度优先遍历代码,一段报错一段正常,差异原因如下:

报错代码

void dfs(int row,int col,vector<vector<int>>& vis,vector<vector<char>>& mat,int delrow[],int delcol[])
{
    // 出现段错误
    vis[row][col] = 1;
    int n = mat.size();
    int m = mat[0].size();
    for(int i=0;i<4;i++){
        int nrow = row + delrow[i];
        int ncol = col + delcol[i];
        if(!vis[nrow][ncol] && nrow>=0 && nrow<n && ncol>=0 && ncol<m 
        && mat[nrow][ncol] =='O'){
            dfs(nrow,ncol,vis,mat,delrow,delcol);
        }
    }
}

正常运行代码

void dfs(int row,int col,vector<vector<int>>& vis,vector<vector<char>>& mat,int delrow[],int delcol[])
{
    vis[row][col] = 1; 
    int n = mat.size();
    int m = mat[0].size();
    
    for(int i = 0;i<4;i++) {
        int nrow = row + delrow[i];
        int ncol = col + delcol[i]; 
        if(nrow >=0 && nrow <n && ncol >=0 && ncol <m 
        && !vis[nrow][ncol] && mat[nrow][ncol] == 'O') {
            dfs(nrow, ncol, vis, mat, delrow, delcol); 
        }
    }
}

核心差异原因

两段代码的唯一区别是if判断条件的顺序:

  • 报错代码中,先执行!vis[nrow][ncol]判断,再检查坐标合法性。当nrow或ncol超出数组范围(比如负数、大于等于n/m)时,直接访问vis[nrow][ncol]会触发数组越界访问,这是段错误的直接原因。
  • 正常代码中,先判断坐标是否在合法范围内(nrow >=0 && nrow <n && ncol >=0 && ncol <m),确保后续访问vis和mat数组时不会越界,再执行其他条件判断,因此不会触发段错误。

内容的提问来源于stack exchange,提问作者Arka Mukherjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:42:26