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

C语言中如何实现数组动态扩容?用于开发支持任意科目数的成绩平均分计算程序

实现代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 初始数组容量,后续不足自动扩容
    int capacity = 4;
    // 已录入的成绩数量
    int count = 0;
    // 成绩总分
    int sum = 0;
    // 申请初始动态数组内存
    int *grades = malloc(capacity * sizeof(int));
    if (grades == NULL) {
        printf("内存申请失败\n");
        return 1;
    }

    printf("请输入你的主课成绩(用空格分隔)\n");
    int temp;
    // 循环读取输入的成绩,直到遇到非整数或输入结束
    while (scanf("%d", &temp) == 1) {
        // 数组存满时扩容为原容量的2倍,和C++ vector的扩容逻辑一致
        if (count >= capacity) {
            capacity *= 2;
            int *temp_ptr = realloc(grades, capacity * sizeof(int));
            if (temp_ptr == NULL) {
                printf("内存扩容失败\n");
                free(grades);
                return 1;
            }
            grades = temp_ptr;
        }
        grades[count] = temp;
        sum += temp;
        count++;
    }

    // 处理未输入有效成绩的边界情况
    if (count == 0) {
        printf("未检测到有效成绩\n");
        free(grades);
        return 0;
    }

    // 计算平均分,转double避免整数除法截断,输出保留0位小数即四舍五入取整
    double average = (double)sum / count;
    printf("你的平均分为%.0f\n", average);

    // 释放动态内存,避免泄漏
    free(grades);
    return 0;
}

核心说明

  • 采用二倍扩容的逻辑,均摊时间复杂度为O(1),性能表现和C++的std::vector一致,不需要提前预设成绩数量
  • 逐次读取输入的成绩,支持任意数量的成绩输入,输入完成后按结束快捷键(Windows系统按Ctrl+Z,Linux/macOS系统按Ctrl+D)即可触发计算
  • 补充了内存申请失败的异常处理,避免程序崩溃
  • 你补充的示例代码存在错误:realloc(numbers,200 * sizeof(numbers))是错误写法,numbers是指针,sizeof(numbers)取到的是指针自身的字节大小,不是int类型的大小,正确写法应该是200 * sizeof(int)或者200 * sizeof(*numbers)

内容的提问来源于stack exchange,提问作者cs07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:21:02