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

二维数组索引递增时触发Segmentation fault错误求助

问题原因分析
  • 循环维度匹配错误:函数参数arr_rows是数组行数,arr_columns是列数,但代码里i循环遍历列数范围、j循环遍历行数范围,完全搞反了行和列的访问逻辑,导致索引混乱。
  • 数组越界访问:沙漏是3×3结构,遍历行时i的最大取值必须是arr_rows - 3(保证i+2不超出最后一行索引),遍历列时j的最大取值必须是arr_columns - 3(保证j+2不超出最后一列索引)。原代码未限制边界,当i、j接近数组维度上限时,i+1、i+2、j+1、j+2会超出合法索引范围,触发段错误。
  • 最大值初始化不合理:max初始化为0,若所有沙漏和都是负数,函数会错误返回0而非实际最大和。
修复后的代码
#include <stdio.h>
#include <limits.h>

int hourglassSum(int arr_rows, int arr_columns, int** arr) {
    int sum;
    // 用最小整数初始化max,兼容全负数场景
    int max = INT_MIN;
    // 行遍历:预留足够空间容纳3行的沙漏
    for(int i = 0; i <= arr_rows - 3; i++){
        // 列遍历:预留足够空间容纳3列的沙漏
        for(int j = 0; j <= arr_columns - 3; j++){
            sum = arr[i][j] + arr[i][j+1] + arr[i][j+2]
                + arr[i+1][j+1]
                + arr[i+2][j] + arr[i+2][j+1] + arr[i+2][j+2];
            if(sum > max){
                max = sum;
            }
        }
    }
    return max;
}
修复说明
  • 修正循环维度匹配问题,i对应行索引、j对应列索引,符合二维数组访问逻辑。
  • 调整循环边界,确保所有索引访问都在数组合法范围内,彻底解决越界导致的段错误。
  • 用INT_MIN初始化max,覆盖所有沙漏和为负数的场景,保证结果正确性。

内容的提问来源于stack exchange,提问作者Dark Fire Master

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:40:02