2013-04-21 2 views
0

첫 번째 인수로 큰 숫자를 입력 할 때까지 잘 작동하는 짧은 C 프로그램이 있습니다. 1000000을 사용하면 Segmentation fault이되지만 1000000은 사용하지 않습니다. 배열이 너무 크기 때문에 이것이 확실합니다. 이 문제를 어떻게 해결할 수 있습니까? 나는 C.C에서 큰 배열을 수정하는 방법은 무엇입니까?

에 아주 새로운 오전 여기 내 코드입니다 : 당신은 여기 int primes[limit];

스택을 사용 dynamic allocation instead에 너무 많은 메모리를 할당 할

#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

디버거는 세그먼트 오류가 occures 말하는가? –

+0

배열 대신 연결 목록 사용을 고려하십시오. – fardjad

+0

당신은 스택에 배열을 할당하고 있습니다. 스택은 유한하고 작은 크기 (일반적으로 1MB)입니다. malloc을 사용하여 배열을 할당 해보십시오 (자유롭게하십시오). – Thomas

답변

3

교체

free(primes); 
1

가.

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]); 
} 

을 그리고 사용 후 메모리를 해제 :

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

... 

free(primes) 
0

primes 배열이 main() 인 경우 스택에 할당되며 whick은 고정 된 크기 제한을 갖습니다.

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

을 완료하고 힙에서 제거 :

힙에 넣어보십시오 어떤 라인에서

free(primes); 
관련 문제