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

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] = 30
  • i=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:42:56