我试图将文件中的前两个数字存储为变量,然后将剩余的数字存储在数组的文件中。
以下代码在较小的输入上工作正常,但我想知道 - 为什么它在较大的输入文件上出错?我能够在返回分段错误: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);
正如@ForceBru已经简要评论的那样,这是int list[param2];
的问题
当像这样声明列表时,缓冲区存储在堆栈上,分配只需编译器通过 param2 量增加堆栈指针即可。
如果使用缓冲区后分配的 j 进行编译(此处可能是这种情况(,则计算机将访问存储 0 (j = 0(stack_pointer + param2 * sizeof(int) + sizeof(int)
的位置。
堆栈是有限的,因此这个站点的名称是,当一个远离堆栈的缓冲区被访问时,内核只会看到你写在离任何合法内存很远的地方,它会假设出了什么问题。
对于大型缓冲区,请查看malloc。