첫 번째 인수로 큰 숫자를 입력 할 때까지 잘 작동하는 짧은 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;
}
디버거는 세그먼트 오류가 occures 말하는가? –
배열 대신 연결 목록 사용을 고려하십시오. – fardjad
당신은 스택에 배열을 할당하고 있습니다. 스택은 유한하고 작은 크기 (일반적으로 1MB)입니다. malloc을 사용하여 배열을 할당 해보십시오 (자유롭게하십시오). – Thomas