SIGSEGV с чрезвычайно большим массивом в цикле C ++ - PullRequest
0 голосов
/ 27 декабря 2011

Следующий код, который печатает некоторые простые числа с использованием sieve, генерирует ошибку SIGSEGV на онлайн-судье.

int main()
{
long count=1;
int arr[100000000];
printf("2\n");
for(long i=3;i<100000000;i=i+2)
{
    arr[i]=1;
}
for(long i=3;i<100000000;i=i+2)
{
    if(arr[i]==1)
    {
        count++;
        if(count%100==1)printf("%ld\n",i);
        for(long j=2;i*j<100000000;j++)
            arr[i*j]=0;
    }
}
//scanf("%ld",&count);
}

но если я уберу некоторые утверждения как:

for(long i=3;i<100000000;i=i+2)
{
    if(arr[i]==1)
    {
        count++;
    }
}

изменить второй цикл, как указано выше. это не показывает ошибку. Может ли какая-то помощь относительно того, почему это происходит и как исправить это в первой программе.

1 Ответ

6 голосов
/ 27 декабря 2011

Это почти наверняка переполнение стека, вызванное объявлением огромного автоматического массива. Автоматические переменные обычно помещаются в стек, максимальный размер которого обычно составляет несколько мегабайт.

Вы можете исправить это, используя динамический массив, обычно размещаемый в куче:

std::vector<int> arr(100000000);
...