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
相关产品推荐
相关产品推荐

