输出段错误

Segmentation fault at output

我在以下 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 << c << std::endl; 行。如果我删除该行,程序运行正常。

谁能给我解释一下为什么会这样,背后是否有更深层次的逻辑?我还是一个 C++ 初学者,由于编译器错误只说 "segmentation fault" 而没有任何其他信息,我在这里有点不知所措。

还有,我该如何解决? :-)

非常感谢任何帮助!

PS:我知道关于这个话题有无数的话题。但这在某种程度上只会让获取有用信息变得更加困难。我查看了 Wiki 条目,但它似乎没有涵盖我的问题。

可能您试图在 main() 函数中保留太多内存(我的意思是互素数数组,3000x3000 的布尔值超过 8MB)。有关详细信息,请参阅 here

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

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