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

我写的C语言判断两个数组是否升序的函数出错,问题出在哪?

错误原因分析

核心问题是数组越界访问,你的循环逻辑存在边界错误:

  • 长度为n的数组t,合法下标范围是0 ~ n-1,你写的for (k=0; k<n; k++)会在最后一次循环时访问t[k+1]也就是t[n],这个位置属于数组外的内存,存储的是不可预测的随机值。
  • 同理第二个数组g的循环for (l=0; l<m; l++)会访问到g[m],同样是越界的非法访问。

哪怕两个数组本身是升序排列的,越界读取的随机值大概率比数组最后一个元素小,就会触发 t[k] > t[k+1]的判断,把sorted或者sorted2改为0,最终返回0。

修复方案

把两个循环的终止条件改为k < n-1和l < m-1即可,修改后的代码如下:

int VerifTri(int t[], int g[], int n, int m)
{   
    int k, l; 
    int sorted = 1, sorted2 = 1;

    // 循环到倒数第二个元素即可,避免越界访问
    for (k=0; k < n-1; k++)
    {
        if( t[k] > t[k+1] )
            sorted = 0;
    }

    for (l=0; l < m-1; l++)
    {
        if (g[l] > g[l+1])
        {
            sorted2 = 0;
        }
    }

    return (sorted && sorted2) ? 1 : 0;
}
额外优化建议
  • 一旦发现逆序可以直接加break跳出循环,不需要遍历完整个数组,提高运行效率
  • 可以把判断单个数组是否升序的逻辑封装成独立函数,减少重复代码

内容的提问来源于stack exchange,提问作者10969_ shirazu_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:03