输出出现分段故障

Segmentation fault at output

本文关键字:故障 分段 输出      更新时间:2023-10-16

我在下面的C++程序中遇到了一个分段错误。

#include<iostream>
const int N = 3000;
int main() {
    bool coprimes[N][N];
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            coprimes[i][j] = ((3 * i + j) % 17 == 0);
        }
    }
    for (int c = 1; c < N; ++c) {
        for (int a = 1; a < c / 2; ++a) {
            int b = c - a;
            if (!coprimes[a][b] || !coprimes[a][c] || !coprimes[b][c]) {
                continue;
            }
            std::cout << c << std::endl;
        }
    }
}

(程序本身没有多大意义。我只是试图创建一个最低限度的工作示例。)

奇怪的是,它在std::cout<lt;c<lt;std::endl;。如果我去掉那一行,程序就会正常工作。

有人能向我解释为什么会发生这种情况,以及背后是否有更深层次的逻辑吗?我还是一个C++初学者,由于编译器错误只说"分段错误",没有任何额外信息,所以我在这里有点不知所措。

还有,我该如何修复它?:-)

非常感谢您的帮助!

附言:我知道关于这个话题有很多线索。但不知何故,这只会使获取有用信息变得更加困难。我查看了Wiki条目,但它似乎没有涵盖我的问题。

由于coprimes矩阵过大,因此存在堆栈溢出问题。您可以在堆上动态分配内存(不要忘记释放)。

bool **coprimes = new bool*[N];
for (int i = 0; i < N; ++i)
    coprimes[i] = new bool[N];

可能您试图在main()函数中保留太多内存(我指的是协处理器数组,3000x3000的bool,它超过8MB)。请参阅此处了解更多详细信息。