统计m×n矩阵从左上到右下路径数时出现SIGSEGV错误如何解决
问题根因与修复方案
核心错误点
- memset参数严重错误:
sizeof(dist)本身已经是int dist[1000][1000]数组的总字节数,代码中额外乘以1000*1000后,memset会往超出数组边界的内存空间写数据,非法访问内存直接触发SIGSEGV段错误。 - 可选优化:避免栈溢出风险:栈上分配1000×1000的int数组(约4MB)在部分默认栈空间较小的环境下也可能触发栈溢出,建议将数组声明为全局变量,或者使用动态内存分配。
- 逻辑严谨性优化:递归判断顺序建议调整为先判断边界(m/n为0、起点条件),再访问记忆化数组,避免传入非法下标时访问数组越界位置。
修复后可运行代码
#include <bits/stdc++.h> using namespace std; // 全局数组默认在全局区存储,不受栈大小限制 int dist[1000][1000]; int path(int m, int n) { // 先判断边界条件,避免非法下标访问数组 if(m == 0 || n == 0) { return 0; } if(m == 1 && n == 1) { return 1; } if(dist[m][n] != -1) { return dist[m][n]; } dist[m][n] = path(m-1, n) + path(m, n-1); return dist[m][n]; } int main() { memset(dist, -1, sizeof(dist)); int s = path(3,3); cout << s << endl; // 3×3矩阵路径数为6,可输出验证结果 return 0; }
如果要保留原代码的数组传参写法,仅修改memset行即可正常运行:
// 原main函数修改后版本 int main() { int dist[1000][1000]; // 去掉多余的1000*1000乘数 memset(dist, -1, sizeof(dist)); int s=path(3,3,dist); return 0; }
内容的提问来源于stack exchange,提问作者Dhritabrata Mitra
相关产品推荐
相关产品推荐

