C++数组传递异常:升序判断函数返回结果错误求助
问题分析与修复方案
我帮你找出了几个关键问题,这就是为什么你的代码总是返回true的原因:
1. 降序数组生成逻辑完全写反了
你以为按4键时生成的是[30,29,...,1]的降序数组,但实际代码生成的是升序数组!看这段代码:
else { for (int i = n-1; i >= 0; i--) { c[i] = i + 1; } // ... }
当n=30时,i从29递减到0:
i=29→c[29] = 30i=28→c[28] = 29- ...
i=0→c[0] = 1
最终数组c的元素是[1,2,3,...,30]——标准的升序,所以isOrdered自然返回1(有序)。
要生成真正的降序数组,应该把赋值改成c[i] = n - i,这样:
for (int i = 0; i < n; i++) { // 用正向循环更直观,当然反向也行 c[i] = n - i; }
或者保持反向循环的话,改成:
for (int i = n-1; i >= 0; i--) { c[i] = (n-1 - i) + 1; // 等价于n - i }
这样生成的数组才是[30,29,...,1],此时isOrdered会检测到arr[i-1] >= arr[i],返回-1。
2. 严重的内存泄漏问题
你在每次循环里用new创建了6个数组指针,但从来没有释放它们:
int* a = new int[n]; int* b = new int[n]; int* c = new int[n]; int* a_c = new int[n]; int* b_c = new int[n]; int* c_c = new int[n];
这会导致程序运行时内存持续被占用,次数多了会引发内存不足。必须在每次循环结束时用delete[]释放这些数组:
// 在每次循环的末尾(重新提示用户输入之前)添加: delete[] a; delete[] b; delete[] c; delete[] a_c; delete[] b_c; delete[] c_c;
3. 调试输出的小优化
在isOrdered函数里,你每次循环都输出arr[i]并换行,这会导致输出大量冗余内容。如果想快速验证数组内容,可以在调用isOrdered之前先打印目标数组,比如在input==4的分支里:
for (int i = 0; i < n; i++) { cout << c_c[i] << ' '; } cout << endl;
这样你就能直观看到数组是不是你想要的降序了。
修复后的关键代码示例
修正降序数组生成和内存释放后的部分代码:
else { // 生成正确的降序数组 for (int i = 0; i < n; i++) { c[i] = n - i; } // 复制数组 for (int i = 0; i < n; i++) { c_c[i] = c[i]; } // 先打印数组验证 cout << "降序数组:"; for (int i = 0; i < n; i++) { cout << c_c[i] << ' '; } cout << endl; // 调用判断函数 cout << isOrdered(c_c, n) << endl; } // 释放内存 delete[] a; delete[] b; delete[] c; delete[] a_c; delete[] b_c; delete[] c_c; // 重新提示用户输入...
现在按4键时,程序会输出降序数组,然后检测到无序,输出"array is not sorted"并返回-1,完全符合预期。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

