我正在學習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