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

统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:03