大文件上fscanf的分段错误

时间:2020-02-09 20:29:35

标签: c memory segmentation-fault scanf

我试图将文件中的前两个数字存储为变量,然后将剩余的数字存储在数组中的文件中。

以下代码在较小的输入上可以正常工作,但是我想知道-为什么在较大的输入文件上会出错?在获得Segmentation Fault:返回11之前,我能够打印出for循环中的所有值。

FILE * fp;

fp = fopen("test.text", "r");

int i;
fscanf(fp, "%d", &i);
int param1 = i;
fscanf(fp, "%d", &i);
int param2 = i;

int list[param2];
int j;

for (j = 0; j < param2; j++) {
  fscanf(fp, "%d", &list[j]);
}
fclose(fp);

1 个答案:

答案 0 :(得分:2)

@ForceBru已经简要评论过,这是read -t 1 -n 10000 discard read -p "Give me some input: " input

的问题

当这样声明一个列表时,缓冲区存储在堆栈中,只需通过编译器将堆栈指针增加param2数量即可进行分配。

如果使用在缓冲区之后分配的j进行编译,则可能是这种情况,计算机将访问位置int list[param2];来存储0(j = 0)。

堆栈是有限的,因此此站点的名称是,当访问堆栈之外的缓冲区时,内核只会看到您在远离任何合法内存的地方写东西,并且会认为出了点问题。 / p>

对于大型缓冲区,请看一下malloc。

相关问题