我正在尝试读取包含约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
输出是我所说的细分错误。
答案 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;
}
局部变量的大小受到限制,因此尝试创建“太大”的局部变量将导致无法预测的行为甚至崩溃。保留给局部变量的内存取决于代码的嵌套深度,因此其波动可能很大。这就是为什么将局部变量保持为最小很重要的原因。指针和整数确实很便宜,但是相应大小的数组很麻烦。