在大型文件上使用fscanf的分段错误

问题描述 投票:0回答:1

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

以下代码在较小的输入上可以正常工作,但是我想知道-为什么在较大的输入文件上会出错?在获得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);
c memory segmentation-fault scanf
1个回答
0
投票

正如@ForceBru已经简要评论过,这是int list[param2];的问题

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.