检查矩阵是否为 Toeplitz,如果不是,则代码在 *** 上崩溃。不知道为什么
if
声明无法阻止它。
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) {
// *** the code crashed here
if (matrix[i + k][j + k] != matrix[i][j]) {
z = 1;
} else if ((i + k) == (M - 1) || (j + k) == (N - 1)) {
break;
}
}
}
}
}
}
内部
for
循环可以继续进行,而不会到达 break
语句。在这种情况下,k
不断增加,直到达到INT_MAX
,然后在增加它时甚至在计算i + k
和/或j + k
时,您会出现未定义的行为。可能发生的情况是 i + k
或 j + k
变成一个很大的负值并通过测试 i + k < N
但当您尝试从 matrix[i + k][j + k]
读取时会导致分段错误。
这是修改后的版本:
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
if (j == 0 || i == 0) {
for (k = 0; k < M - i && k < N - j; k++) {
if (matrix[i + k][j + k] != matrix[i][j]) {
z = 1;
}
}
}
}
}