This question already has answers here:
Closed 6 years ago.
Create a big array in C++ [duplicate]
(8个答案)
我有一个很短的C程序,它工作得很好,直到我输入一个大数作为第一个参数。如果我使用10000000,而不是1000000,我会得到
这是我的代码:
与
更新循环边界:
使用后释放内存:
(8个答案)
我有一个很短的C程序,它工作得很好,直到我输入一个大数作为第一个参数。如果我使用10000000,而不是1000000,我会得到
Segmentation fault
。我敢肯定这是因为阵列太大了。我该怎么解决?我对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;
}
最佳答案
替换:
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);
关于c - 如何在C中更正大型数组? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16127406/
10-09 09:05