我写的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_
相关产品推荐
相关产品推荐

