巨大的阵列导致分段错误

时间:2018-10-19 19:59:00

标签: c arrays memory

我正在尝试读取包含约10 ^ 7个值的数据文件并执行一些计算。我正在创建该大小的数组,并进行fscanf来将这些值读入数组的每个元素中。该程序的要旨是这样的

#include<stdio.h>
#include<math.h>

int main()
{
    int L = 10000000;
    float array[L];
    FILE *fp;
    fp = fopen("datafile.txt","r");
    /*
    reading values into the array from datafile.txt using fscanf
    and doing some operations on array elements
    */
    fclose(fp);
    return 0;
}

但是如果我使用较小的L,即L = 10 ^ 6和较小的L,相同的程序就可以工作。
首先,我以为我的笔记本电脑上的主内存较少(〜4GB),然后我尝试在具有16GB和128GB主内存的高端计算机上运行该程序,我也得到了segmentation fault(core dumped)

我用gcc编译了程序,编译后没有任何错误和警告。

gcc my_program.c -lm
./a.out

输出是我所说的细分错误。

1 个答案:

答案 0 :(得分:3)

您可能正在淘汰自己的筹码。对于任何“大”东西,请使用calloc之类的东西动态分配:

int main()
{
    int L = 10000000;
    float *array = calloc(L, sizeof(float));

    FILE *fp;
    fp = fopen("datafile.txt",'r');
    /*
    reading values into the array from datafile.txt using fscanf
    and doing some operations on array elements
    */
    fclose(fp);

    free(array);
    return 0;
}

局部变量的大小受到限制,因此尝试创建“太大”的局部变量将导致无法预测的行为甚至崩溃。保留给局部变量的内存取决于代码的嵌套深度,因此其波动可能很大。这就是为什么将局部变量保持为最小很重要的原因。指针和整数确实很便宜,但是相应大小的数组很麻烦。