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

满足条件触发段错误:Toeplitz矩阵检查代码崩溃排查

问题分析与修复

你的代码崩溃的核心原因是内层无限循环导致数组越界,具体问题点如下:

  • 内层for (k = 0;; k++)没有终止条件,当(i + k) >= M或者(j + k) >= N时,外层的if判断不成立,代码不会进入if块,循环会一直执行,k持续增大直到i+k或j+k超出矩阵的合法索引范围,访问非法内存导致崩溃。
  • 当检测到matrix[i + k][j + k] != matrix[i][j]时,仅设置了z=1但没有退出循环,后续k仍会继续递增,最终触发越界。

修复后的代码

for (i = 0; i < M; i++) {
    for (j = 0; j < N; j++) {
        if (j == 0 || i == 0) {
            for (k = 0;; k++) {
                if ((i + k) < M && (j + k) < N) {
                    if (matrix[i + k][j + k] != matrix[i][j]) {
                        z = 1;
                        break; // 发现不符合特性,直接退出当前对角线检查
                    } else if ((i + k) == (M - 1) || (j + k) == (N - 1)) {
                        break; // 到达对角线末尾,退出循环
                    }
                } else {
                    break; // 超出矩阵范围,强制退出循环
                }
            }
        }
    }
}

额外优化建议

一旦发现矩阵不符合Toeplitz特性(即z=1),可以直接终止所有循环,避免不必要的遍历,提升效率:

int isToeplitz = 1;
for (i = 0; i < M && isToeplitz; i++) {
    for (j = 0; j < N && isToeplitz; j++) {
        if (j == 0 || i == 0) {
            for (k = 0;; k++) {
                if ((i + k) < M && (j + k) < N) {
                    if (matrix[i + k][j + k] != matrix[i][j]) {
                        isToeplitz = 0;
                        break;
                    } else if ((i + k) == (M - 1) || (j + k) == (N - 1)) {
                        break;
                    }
                } else {
                    break;
                }
            }
        }
    }
}
// 最后根据isToeplitz的值判断矩阵是否为Toeplitz矩阵

内容的提问来源于stack exchange,提问作者Malik Halilović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:25:05