两段相似的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
相关产品推荐
相关产品推荐

