我正在学习Robert Sedgewick在C++算法中的C++。现在我正在使用Eratosthenes的Sieve,并且在用户指定的最大素数上限上工作。当我使用max 46349运行代码时,它运行并打印出所有素数达46349,但是当我使用max 46350运行代码时,会发生分段错误。有人可以帮助解释为什么吗?C++数组分配分割错误11新手
./sieve.exe 46349
2 3 5 7 11 13 17 19 23 29 31 ...
./sieve.exe 46350
Segmentation fault: 11
代码:
#include<iostream>
using namespace std;
static const int N = 1000;
int main(int argc, char *argv[]) {
int i, M;
//parse argument as integer
if(argv[1]) {
M = atoi(argv[1]);
}
if(not M) {
M = N;
}
//allocate memory to the array
int *a = new int[M];
//are we out of memory?
if(a == 0) {
cout << "Out of memory" << endl;
return 0;
}
// set every number to be prime
for(i = 2; i < M; i++) {
a[i] = 1;
}
for(i = 2; i < M; i++) {
//if i is prime
if(a[i]) {
//mark its multiples as non-prime
for(int j = i; j * i < M; j++) {
a[i * j] = 0;
}
}
}
for(i = 2; i < M; i++) {
if(a[i]) {
cout << " " << i;
}
}
cout << endl;
return 0;
}
分段错误通常是由超出分配内存边界的写入引起的。您应该使用调试器(或添加打印语句)来跟踪程序的进度,以便找出发生这种情况的时间点。 – 2013-03-02 17:00:04
请注意,如果分配失败,'new'不会返回'NULL'(除非指定'nothrow',否则它不在此处)。它会抛出一个'std :: bad_alloc'异常。 – Cornstalks 2013-03-02 17:00:41