如何在多函数中使用动态分配数组?C语言代码问题求解
基于动态内存实现“从文件读入数组并删除所有最小值”的方案
原代码核心问题
原代码无法完成需求的关键问题包括:
- 读取文件计数后未重置文件指针,导致无法将数据写入数组
- 读取函数无法把动态分配的数组和元素个数传递回主函数
- 主函数调用删除最小值函数时,参数传递语法错误且未获取到数组和元素数量
- 删除最小值函数未处理数组大小更新的传递问题
修正后的实现方案
1. 读取文件并生成动态数组的函数
函数通过输出参数将动态数组和元素个数传递回调用者,同时返回操作状态:
- 参数说明:
const char *file_name:输入参数,指定要读取的文件名int **out_array:输出参数,接收动态分配的数组指针int *out_count:输出参数,接收数组中的元素个数
- 返回值:0表示成功,-1表示文件打开失败,-2表示文件为空,-3表示内存分配失败
#include <stdio.h> #include <stdlib.h> int readingFromFile(const char *file_name, int **out_array, int *out_count) { FILE *file = fopen(file_name, "r"); if (file == NULL) { return -1; } int count = 0; int number; // 第一次遍历:统计数字个数 while (fscanf(file, "%d", &number) == 1) { count++; } if (count == 0) { fclose(file); return -2; } // 重置文件指针到开头,准备读取数据 rewind(file); // 动态分配内存 *out_array = malloc(sizeof(int) * count); if (*out_array == NULL) { fclose(file); return -3; } // 第二次遍历:将数字写入数组 for (int i = 0; i < count; i++) { fscanf(file, "%d", &(*out_array)[i]); } *out_count = count; fclose(file); return 0; }
2. 删除数组中所有最小值的函数
采用原地修改数组的方式,同时更新数组大小:
- 参数说明:
int *array:输入参数,要处理的动态数组int *size:输入输出参数,传入原数组大小,传出删除最小值后的新大小
- 返回值:0表示成功,-1表示数组为空
int removeAllMinValues(int *array, int *size) { if (*size == 0) { return -1; } // 找到最小值 int min_val = array[0]; for (int i = 1; i < *size; i++) { if (array[i] < min_val) { min_val = array[i]; } } // 原地覆盖,保留非最小值元素 int new_size = 0; for (int i = 0; i < *size; i++) { if (array[i] != min_val) { array[new_size] = array[i]; new_size++; } } // 更新数组大小 *size = new_size; return 0; }
3. 主函数调用示例
int main(void) { int *array = NULL; int count = 0; int res = readingFromFile("1.txt", &array, &count); if (res == -1) { printf("Error opening file\n"); return 1; } if (res == -2) { printf("Empty file\n"); return 1; } if (res == -3) { printf("Memory allocation failed\n"); return 1; } // 打印原数组 printf("Original array: "); for (int i = 0; i < count; i++) { printf("%d ", array[i]); } printf("\n"); // 删除所有最小值 res = removeAllMinValues(array, &count); if (res == -1) { printf("Array is empty\n"); free(array); return 1; } // 打印处理后的数组 printf("Array after removing min values: "); for (int i = 0; i < count; i++) { printf("%d ", array[i]); } printf("\n"); // 释放动态分配的内存 free(array); return 0; }
关键注意事项
- 动态分配的内存必须在使用完后用
free()释放,避免内存泄漏 - 操作文件后必须调用
fclose()关闭文件句柄 - 使用输出参数传递动态数组和大小,是因为C语言无法直接返回数组类型,只能通过指针传递
- 如果删除最小值后数组大小大幅减小,可以调用
realloc()重新分配内存以节省空间(可选优化)
内容的提问来源于stack exchange,提问作者ppa
相关产品推荐
相关产品推荐

