如何更正C中的大型数组?

如何更正C中的大型数组?,c,arrays,C,Arrays,我有一个很短的C程序,它工作得很好,直到我输入一个大的数字作为第一个参数。如果我使用10000000,但不是1000000,我会得到分段错误。我很确定这是因为数组太大了。我怎样才能解决这个问题?我对C很陌生 这是我的密码: #include <stdio.h> #include <math.h> #include <stdlib.h> int isPrime(int n); int main(int argc, char **argv) { int

我有一个很短的C程序,它工作得很好,直到我输入一个大的数字作为第一个参数。如果我使用10000000,但不是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;
}
#包括
#包括
#包括
intisprime(intn);
int main(int argc,字符**argv){
整数极限;
limit=strtol(argv[1],NULL,0);
int scur=0,checkp=(int)(限值/275);
如果(限值<2){
printf(“无效限制。\n”);
返回0;
}
整数素数[极限];
素数[0]=2;
int i,j=1;
printf(“生成素数…\r”);
对于(i=3;i
您想在这里为堆栈分配太多内存
int primes[limit]


使用。

您想在这里为堆栈分配太多内存
int primes[limit]

使用。

更换:

int primes[limit];

更新回路边界:

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

int primes[limit];

更新回路边界:

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

main()
中的
primes
数组是在堆栈上分配的,堆栈有固定的大小限制

尝试将其放在堆上:

int* primes = (int*)malloc(limit * sizeof(int));
并在完成后将其从堆中移除:

free(primes);

main()
中的
primes
数组是在堆栈上分配的,堆栈有固定的大小限制

尝试将其放在堆上:

int* primes = (int*)malloc(limit * sizeof(int));
并在完成后将其从堆中移除:

free(primes);

调试器在哪一行表示分割错误?考虑使用链表而不是数组。您在堆栈上分配该数组,该数组具有有限的、小的大小(通常为1MB)。尝试使用Maloc来分配数组(记住空闲)。这个线程在调试器的哪一行上更具体地说分段错误发生?考虑使用链表而不是数组。你在栈上分配那个数组,它有一个有限的、小的大小(通常是1MB)。尝试使用malloc分配数组(记住释放)。此线程更特定于C