满足条件触发段错误: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ć
相关产品推荐
相关产品推荐

