【发布时间】:2014-01-06 20:31:08
【问题描述】:
此 insertnext 函数尝试将其输入文件中的整数放入一个大小正好合适的数组中,但限制是该文件只能读取一次。此递归函数跟踪读取的整数数量,在基本情况下(当文件没有更多整数时)为其数组分配内存,然后将整数写入数组。
#include <stdio.h>
#include <stdlib.h>
void insertnext(FILE *fp, int *a, long i) {
int cur;
fscanf(fp, "%d", &cur);
if (feof(fp)) // BASE CASE: Allocate Memory
a = (int *) malloc(i * sizeof(int));
else {
insertnext(fp, a, i+1); // GENERAL CASE's RECURSIVE CALL
a[i] = cur; // Executes after the base case does
}
}
int main() {
int *a;
FILE *fp = fopen("text.txt", "r");
insertnext(fp, a, 0);
return 0;
}
程序确实执行函数的基本情况,并为整数数组 a 分配正确的内存量。但是,在第一次执行 a[i] = cur 行时,程序会输出“Segmentation fault (core dumped)”。在我看来,整数指针 a 在完成基本案例的函数调用后不再指向分配的内存,尽管我不明白为什么会发生这种情况。
您对问题可能是什么有任何想法?
【问题讨论】:
-
注意,使用这种方法,所有整数都先放入堆栈,然后再复制到动态数组中。根据输入文件的大小,您将有堆栈溢出。
-
谢谢!这是一个非常有用的观察。