You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多函数中使用动态分配数组?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:23:14