C++中Max & Min 1函数异常输出问题排查与分析
先来看你遇到的问题:输入6 -80 800 -8000 -800 80 8000后,输出却是max is 4253776 min is 4253776,这明显是代码里有好几处关键错误导致的,我来逐个拆解:
错误原因分析
未初始化数组导致垃圾值污染:你在
ma_mi函数里一开始就把max和min初始化为a[0],但这时候数组a还没有被输入任何数据!主函数里int a[n];是未初始化的栈数组,a[0]的值是栈上的随机垃圾数据,这就是输出里那个奇怪数字的来源。而且你是在for循环里才开始给数组元素赋值,初始化max/min的时机完全错了。最值更新逻辑完全写反:看这两行核心代码:
if (*(a+i)>max) *(a+i)=max; if (*(a+i)<min) *(a+i)=min;你搞反了赋值方向!正确逻辑应该是:当当前元素比
max大时,把max更新为当前元素;当当前元素比min小时,把min更新为当前元素。而你现在是把当前元素改成了max/min,这不仅没法更新最值,还直接破坏了输入的数组数据。非标准变长数组(VLA)问题:C++标准并不支持
int a[n];这种变长数组(虽然部分编译器比如GCC会把它作为扩展支持,但这不是跨平台的标准写法),如果编译器不支持该扩展,代码直接编译失败。函数返回值不匹配:
ma_mi函数声明的返回类型是int,但函数体里没有任何return语句,这会导致未定义行为,程序可能出现各种奇怪的运行问题。
修正后的代码
我用C++标准的std::vector来替代变长数组,同时修正所有逻辑错误,调整函数返回类型:
#include <iostream> #include <vector> using namespace std; void ma_mi(vector<int>& a, int n) { int max_val = a[0], min_val = a[0]; // 从第2个元素开始比较,第一个元素已作为初始最值 for (int i = 1; i < n; i++) { if (a[i] > max_val) { max_val = a[i]; } if (a[i] < min_val) { min_val = a[i]; } } cout << "max is " << max_val << " min is " << min_val << endl; } int main() { int n; cin >> n; vector<int> a(n); // 在主函数里完成数组输入,逻辑更清晰 for (int i = 0; i < n; i++) { cin >> a[i]; } ma_mi(a, n); return 0; }
如果一定要用原生数组而不是vector,也可以用动态分配的方式:
#include <iostream> using namespace std; void ma_mi(int* a, int n) { int max_val = a[0], min_val = a[0]; for (int i = 1; i < n; i++) { if (a[i] > max_val) { max_val = a[i]; } if (a[i] < min_val) { min_val = a[i]; } } cout << "max is " << max_val << " min is " << min_val << endl; } int main() { int n; cin >> n; int* a = new int[n]; // 动态分配数组 for (int i = 0; i < n; i++) { cin >> a[i]; } ma_mi(a, n); delete[] a; // 记得释放动态分配的内存 return 0; }
现在输入6 -80 800 -8000 -800 80 8000,就能得到正确的输出:max is 8000 min is -8000。
内容的提问来源于stack exchange,提问作者Lizzar_00

