C语言计算输入数值列表最小值时输出始终为0的问题求助
问题分析与修复方案
核心问题点
- 数组大小不匹配:你定义的数组是
double num[size-1];,但后续循环读取了size个元素,这会触发数组越界访问,属于未定义行为,是最小值异常的核心诱因。 - max/min初始化时机错误:在读取数组元素前就用
num[0]初始化max和min,此时数组元素是未初始化的垃圾值,后续的比较逻辑完全失效。
修复后的代码
#include <stdio.h> #include <float.h> int main(int argc, char** argv) { int size; scanf("%d", &size); // 调整数组大小为size,匹配输入元素数量 double num[size]; double sum = 0; double dx = 0; double avg, var; // 先读取所有输入元素 for(int i = 0; i < size; i++){ scanf("%lf", &num[i]); } // 用第一个有效输入值初始化max和min double max = num[0]; double min = num[0]; // 计算总和同时更新最大值、最小值 for(int i = 0; i < size; i++){ sum += num[i]; if(num[i] < min){ min = num[i]; } if(num[i] > max){ max = num[i]; } } avg = sum/(double)size; for(int i = 0; i < size; i++){ dx += ((num[i]-avg)*(num[i]-avg)); } var = dx/(double)(size); printf("AVG: %0.4f\n", avg); printf("VAR: %0.4f\n", var); printf("MAX: %0.4f\n", max); printf("MIN: %0.4f\n", min); return 0; }
关键修改说明
- 修正数组大小为
size,确保能容纳所有输入元素,彻底解决越界问题。 - 将
max和min的初始化移至读取完数组元素之后,使用第一个有效输入值作为基准,保证比较逻辑的正确性。 - 修复了
printf中的换行符格式,改为标准的\n。
额外优化建议
- 增加
size输入合法性检查(如size <= 0时提示错误并退出),避免创建无效的空数组。 - 若需处理大量数据,建议使用
malloc/free动态分配内存,替代变长数组,提升代码兼容性与安全性。
内容的提问来源于stack exchange,提问作者Steven Oh
相关产品推荐
相关产品推荐

