【问题标题】:Recursively read integers into an array of exactly the right size using C使用 C 递归地将整数读入大小正确的数组
【发布时间】: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 在完成基本案例的函数调用后不再指向分配的内存,尽管我不明白为什么会发生这种情况。

您对问题可能是什么有任何想法?

【问题讨论】:

  • 注意,使用这种方法,所有整数都先放入堆栈,然后再复制到动态数组中。根据输入文件的大小,您将有堆栈溢出。
  • 谢谢!这是一个非常有用的观察。

标签: c file-io recursion


【解决方案1】:

为了使新分配的数组指针传播回调用堆栈,您需要通过指针传递它(即使用int**):

void insertnext(FILE *fp, int **a, long i) {
    //...
    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;
    //...
    insertnext(fp, &a, 0);
    //...
}

【讨论】:

  • 感谢您的解释。此外,此代码运行良好。
【解决方案2】:

malloc 返回值(内存区域中的指针)在基本情况丢失后丢失。 您可以尝试使用以下函数声明:

void insertnext(FILE *fp, int **a, long i)

并相应修改功能代码。

【讨论】:

  • 感谢您的解释!
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 2016-03-26
  • 2014-12-26
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
相关资源
最近更新 更多