条件满足时会产生分段错误

问题描述 投票:0回答:1

检查矩阵是否为 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;
                    }
                }
            }
        }
    }
}
c for-loop matrix segmentation-fault toeplitz
1个回答
0
投票

内部

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;
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.