0

最初の引数として大きな数を入力するまでは、正常に動作する短い C プログラムがあります。10000000 を使用した場合は得られますSegmentation faultが、1000000 ではありません。これは、配列が大きすぎるためであると確信しています。どうすればこれを修正できますか? 私は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;
}
4

4 に答える 4

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);
于 2013-04-21T02:42:32.223 に答える
1

ここでスタックにあまりにも多くのメモリを割り当てたいint primes[limit];

代わりに動的割り当てを使用してください。

于 2013-04-21T02:39:57.003 に答える
0
int* primes = (int*) malloc(sizeof(int) * limit);

...

free(primes)
于 2013-04-21T02:42:36.860 に答える
0

配列primesmain()スタックに割り当てられますが、サイズ制限は固定されています。

ヒープに置いてみてください:

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

完了したら、ヒープから削除します。

free(primes);
于 2013-04-21T02:44:29.757 に答える