2013-04-21 3 views
0

У меня есть короткая программа на C, которая отлично работает, пока я не введу большое число в качестве первого аргумента. Я получаю Segmentation fault, если я использую 10000000, но не 1000000. Я вполне уверен, что это потому, что массив слишком велик. Как я могу это исправить? Я очень новой для C.Как исправить большой массив в C?

Вот мой код:

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

int isPrime(int n); 

int main(int argc, char **argv) { 
    int limit; 
    limit = strtol(argv[1], NULL, 0); 
    int scur = 0, checkp = (int) (limit/275); 

    if (limit < 2) { 
     printf("Invalid limit.\n"); 
     return 0; 
    } 

    int primes[limit]; 
    primes[0] = 2; 
    int i, j = 1; 
    printf("Generating primes...\r"); 
    for (i = 3; i < limit; i += 2, scur++) { 
     if (scur == checkp) { 
      scur = 0; 
      printf("\rGenerating primes... (%.2f%%)", (i * 100.0/limit)); 
     } 
     if (isPrime(i)) { 
      primes[j] = i; 
      j++; 
     } 
    } 
    printf("\nPrimes below %i generated.\n", limit); 
    printf("Writing to file...\n"); 

    FILE *file; 
    file = fopen("primes.txt", "w"); 
    int k; 
    for (k = 0; k < (sizeof(primes)/sizeof(int)); k++) { 
     if (primes[k] == 0) break; 
     fprintf(file, "%i\n", primes[k]); 
    } 
    fclose(file); 
    printf("Finished.\n"); 

    return 0; 
} 

int isPrime(int n) { 
    if (n < 2) return 0; 
    else if (n == 2) return 1; 
    else { 
     if (n % 2 == 0) return 0; 
     int i; 
     for (i = 3; i < ((int) sqrt(n)) +1; i += 2) { 
      if (n % i == 0) return 0; 
     } 
    } 
    return 1; 
} 
+0

на то, что линия делает отладчик говорят ошибки сегментации встречается,? –

+0

Рассмотрите возможность использования связанных списков вместо массивов. – fardjad

+0

Вы выделяете этот массив в стек, который имеет конечный малый размер (обычно 1 МБ). Попробуйте использовать malloc для выделения массива (не забудьте освободить). – Thomas

ответ

3

Заменить:

int primes[limit]; 

С

int *primes = calloc(limit,sizeof(int)); 

Обновление границы цикла:

for (k = 0; k < limit; k++) { 
    if (primes[k] == 0) break; 
    fprintf(file, "%i\n", primes[k]); 
} 

И освободить память после использования:

free(primes); 
1

Вы хотите выделить слишком много памяти в стек здесь int primes[limit];

Использование dynamic allocation instead.

0
int* primes = (int*) malloc(sizeof(int) * limit); 

... 

free(primes) 
0

Ваш массив primes в main() выделен на стек, у которого есть ограничение по фиксированному размеру.

Попробуйте поставить его в куче:

int* primes = (int*)malloc(limit * sizeof(int)); 

И удалить его из кучи, когда сделано:

free(primes); 
Смежные вопросы