C++数组分配分段故障11新手

Dav*_*ams 1 c++ memory-management segmentation-fault sieve-of-eratosthenes

我正在学习Robert Sedgewick的Algorithms in C++中的C++.现在我正在研究Eratosthenes的Sieve,用户指定最大素数的上限.当我使用max 46349运行代码时,它运行并打印出所有质数,最高可达46349,但是当我运行max 46350的代码时,会发生分段错误.有人可以帮忙解释原因吗?

./sieve.exe 46349
 2 3 5 7 11 13 17 19 23 29 31 ...

./sieve.exe 46350
 Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 5

你有整数溢出:

        for( int j = i; j * i < M; j++ ) {
            a[i * j] = 0;
        }
Run Code Online (Sandbox Code Playgroud)

46349 * 46349不适合int.

在我的机器,改变的类型j,以long使得能够运行程序较大输入:

    for( long j = i; j * i < M; j++ ) {
Run Code Online (Sandbox Code Playgroud)

根据您的编译器和体系结构,您可能必须使用long long以获得相同的效果.