【问题标题】:How to correct a large array in C? [duplicate]如何纠正C中的大数组? [复制]
【发布时间】:2013-04-14 04:36:18
【问题描述】:

我有一个运行良好的简短 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;
}

【问题讨论】:

  • 调试器在哪一行说发生了分段错误?
  • 考虑使用链表代替数组。
  • 您在堆栈上分配该数组,该数组具有有限的小尺寸(通常为 1MB)。尝试使用 malloc 分配数组(记得释放)。
  • 这个线程更具体的 C stackoverflow.com/questions/5746377/…

标签: c arrays


【解决方案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);

【讨论】:

    【解决方案2】:

    你想在这里给堆栈分配太多内存int primes[limit];

    使用dynamic allocation instead

    【讨论】:

      【解决方案3】:
      int* primes = (int*) malloc(sizeof(int) * limit);
      
      ...
      
      free(primes)
      

      【讨论】:

        【解决方案4】:

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

        试着把它放在堆上:

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

        完成后将其从堆中删除:

        free(primes);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-07
          • 2016-05-11
          相关资源
          最近更新 更多