【发布时间】:2019-03-24 17:53:52
【问题描述】:
我正在尝试读取包含大约 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
正如我提到的,输出是分段错误。
【问题讨论】:
-
数组对于堆栈来说太大了。将数组移出
main,或将数组声明为static。 -
有没有声明数组的上限?这里的堆栈是什么意思? @user3386109
-
en.wikipedia.org/wiki/Call_stack 上限由堆栈大小决定,不同的实现会有所不同。我通常会尽量避免使用大于几 K 字节的数组。第三种选择(除了我在第一条评论中提到的两个之外)是使用
malloc为数组分配内存。 -
贴出的代码无法编译!除其他问题外,此语句:
fp = fopen("datafile.txt",'r');语法错误。第二个参数应该是一个指向字符串的指针,即。fp = fopen("datafile.txt","r");注意使用双引号而不是单引号。你的编译器应该告诉你这个问题。编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意其他编译器使用不同的选项来执行相同的操作 -
OT:调用函数时:
fopen(),始终检查(!=NULL)返回值以确保操作成功