【问题标题】:Segmentation fault with fscanf on large files大文件上 fscanf 的分段错误
【发布时间】:2020-05-25 05:12:18
【问题描述】:

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

以下代码在较小的输入上工作正常,但我想知道 - 为什么它在较大的输入文件上出错?在返回 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);

【问题讨论】:

  • 可能是因为param2太大,所以int list[param2];无法分配
  • @ForceBru d 最多为 2^14。

标签: c memory segmentation-fault scanf


【解决方案1】:

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

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

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

堆栈是有限的,因此该站点的名称是,当访问堆栈之外的缓冲区时,内核只会看到您在远离任何合法内存的地方写入,它会假设出现问题。

对于大缓冲区,看看 malloc。

【讨论】:

    猜你喜欢
    • 2017-03-29
    • 2015-02-09
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多