Сито Эратосфена

Я прочитал на решетке Эратосфена при решении вопроса о Project Euler . Я уверен, вы, ребята, знаете, о каком вопросе я говорю. Итак, вот что. Моему коду удается правильно отобразить все простые числа менее 1 миллиона. Однако, когда я пытаюсь выполнить ту же реализацию за 2 миллиона, это дает мне ошибку сегментации ... У меня есть определенное представление о том, почему ошибка приходит, но не знаю, как ее исправить ... Вот код для простых чисел менее 1 миллиона.

#include
int main(void)
{
   int i,k=2;
   int j;
   int n=1000000;
   int prime[2000000]={};
   for(i=0;in)
                  break;    
            }
         }
      }
   }
   for(i=0;i
3
Это похоже на доступ к возможному доступу через границу: prime [j * prime [i]] = 0 .
добавлено автор Jon, источник
Вы могли изменить int n = 1000000; на int n = 2000000;
добавлено автор Dave, источник
Если он будет индексировать большой массив, он может также использовать size_t
добавлено автор Dave, источник
Обратите внимание, что вы, вероятно, должны использовать другой тип данных, чем int . Int не гарантируется какой-либо конкретный размер, кроме 16 бит. В качестве проблемы стиля я бы рекомендовал long для чисел выше 32k.
добавлено автор logancautrell, источник

1 ответы

Вы выделяете огромный массив в стек:

int prime[2000000]={};

Четыре байта раз два миллиона равно восьми мегабайтам, что часто является максимальным размером стека. Выделение более того приводит к ошибке сегментации.

Вместо этого вы должны выделить массив в куче:

int *prime;
prime = malloc(2000000 * sizeof(int));
if(!prime) {
    /* not enough memory */
}
/* ... use prime ... */
free(prime);
9
добавлено
4 * 2 * 10 ^ 6 = 7,6 * 2 ^ 20 = 7,6 МБ
добавлено автор Dave, источник
Спасибо! ... Он работает сейчас
добавлено автор Ole Gooner, источник