gpt4 book ai didi

c - 使用 C 递归地将整数读入大小正确的数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:18 26 4
gpt4 key购买 nike

此 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 不再指向分配的内存,尽管我不明白为什么会发生这种情况。

您对可能出现的问题有什么想法吗?

最佳答案

为了将新分配的数组指针传播回调用堆栈,您需要通过指针传递它(即使用 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);
//...
}

关于c - 使用 C 递归地将整数读入大小正确的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com