Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 巨大的阵列导致分割错误_C_Arrays_Memory - Fatal编程技术网

C 巨大的阵列导致分割错误

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

我正在尝试读取一个包含大约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;
}

正如我提到的,输出是分段错误。

您可能是在自吹自擂。对于任何“大”的对象,使用以下方式动态分配:


局部变量的大小是有限的,因此试图创建一个“太大”的局部变量将导致不可预测的行为,甚至崩溃。局部变量的剩余内存取决于代码嵌套的深度,因此它可能会大幅波动。这就是为什么将局部变量保持在最小值很重要。指针和整数非常便宜,但是相应大小的数组很麻烦。

数组对于堆栈来说太大了。将数组移到
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;
}