C语言数组遍历异常:递增子数组长度计算结果不符问题咨询
问题分析与解决
首先别担心,刚接触编程遇到这种问题太正常了,我们一步步来拆解你的疑惑~
你的代码核心问题
1. 循环结束后未输出最后一段递增子数组的长度
你的逻辑是当遇到不递增的元素时,输出上一段的长度,但最后一段递增子数组(也就是2,4,5,7对应的长度4)并没有触发else分支——因为整个循环走完都没遇到比它小的元素,所以这段长度根本没机会被打印出来。
当你把循环条件改成i < 7时,其实是访问了数组的越界元素(你的数组只有6个元素,索引是0-5,i=6已经超出范围了)。刚好在你的环境里,这个越界位置的值比a[5]=7小,触发了else分支,才把最后一段的4打印出来。但这种做法非常危险,越界访问属于「未定义行为」,换个环境可能会崩溃或者输出奇怪的结果,绝对不能依赖。
2. 初始循环的越界访问问题
你的循环从i=0开始,第一次判断a[i] > a[i-1]时,i-1=-1,这也是访问数组的越界位置,同样属于未定义行为。虽然在你的环境里没出问题,但这是隐藏的bug。
修正后的代码
我们调整一下逻辑,避免越界,同时确保最后一段长度能被输出:
#include <stdio.h> int main(){ int c = 1; // 每个元素本身就是长度为1的子数组,初始值设为1 int a[] = {1, 3, 2, 4, 5, 7}; int len = sizeof(a)/sizeof(a[0]); // 用这种方式获取数组长度,避免硬编码6 // 从第2个元素开始遍历(索引1),和前一个元素比较 for (int i = 1; i < len; i++) { if (a[i] > a[i-1]) { c++; } else { printf("%d\n", c); c = 1; } } // 循环结束后,输出最后一段的长度 printf("%d\n", c); return 0; }
代码解释
- 初始
c=1:因为单个元素本身就是一个长度为1的递增子数组,符合逻辑。 - 循环从
i=1开始:避免访问a[-1]的越界问题,每次只比较当前元素和前一个元素。 - 用
sizeof(a)/sizeof(a[0])获取数组长度:不用硬编码数字,数组元素变化时也不用手动改循环条件,更灵活。 - 循环结束后额外打印
c:确保最后一段递增子数组的长度不会被遗漏。
运行这段代码,就能得到你预期的输出:
2 4
内容的提问来源于stack exchange,提问作者muhammad abdul
相关产品推荐
相关产品推荐

