C 巨大的阵列导致分割错误
我正在尝试读取一个包含大约10^7个值的数据文件,并执行一些计算。我正在创建一个这样大小的数组,并执行C 巨大的阵列导致分割错误,c,arrays,memory,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"); /* readin
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;
}
正如我提到的,输出是分段错误。您可能是在自吹自擂。对于任何“大”的对象,使用以下方式动态分配:
局部变量的大小是有限的,因此试图创建一个“太大”的局部变量将导致不可预测的行为,甚至崩溃。局部变量的剩余内存取决于代码嵌套的深度,因此它可能会大幅波动。这就是为什么将局部变量保持在最小值很重要。指针和整数非常便宜,但是相应大小的数组很麻烦。数组对于堆栈来说太大了。将数组移到
main
之外,或将数组声明为static
。是否存在声明数组的上限?你说的堆叠是什么意思@user3386109上限由堆栈大小决定,堆栈大小因实现而异。我通常会尽量避免数组大于几个K字节。第三个选项(除了我在第一条注释中提到的两个选项之外)是使用malloc
为数组分配内存!除其他问题外,这条语句:fp=fopen(“datafile.txt”,“r”)代码>的语法错误。第二个参数应该是指向字符串的指针,即fp=fopen(“datafile.txt”,“r”)代码>注意使用双引号而不是单引号。你的编译器应该告诉你这个问题。编译时,始终启用警告,然后修复这些警告。(对于gcc
,至少使用:-Wall-Wextra-Wconversion-pedantic-std=gnu11
)注意其他编译器使用不同的选项来执行相同的操作。因此:调用函数时:fopen()
,始终检查(!=NULL)返回值以确保操作成功
会更好吗?只是吹毛求疵。@Osiris我不明白为什么那样会更好。这看起来很奇怪,很多C代码都是基于能够关注这些事情,所以这通常不是问题。另一方面,C++与代码> Auto/<代码>是另一个协议。是的,我同意你的观点,我只是想指出,有一种选项可以更安全地防止改变类型(实际上只是一个挑剔),即使在C中也是这样。这是一个很好的答案。也许这看起来并不重要,但是如果声明和分配是分开进行的,可能相隔很多行,从可维护性的角度来看,使用对象的类型而不是显式类型要好得多,因此养成这样的习惯是很有用的。这看起来一点也不奇怪——这是一种很好的做法。我只看到专业人士;你认为缺点是什么?请记住,开发人员和维护人员可能不是同一个人,也可能不是同一技能水平,
gcc my_program.c -lm
./a.out
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;
}