我在下面的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)。请参阅此处了解更多详细信息。