数组元素移位输出异常求助:为何需用i+1而非i?
数组移位异常问题解析
问题描述
我有一个数组arr[],先获取输入。当输入为9999时,需要将这些数字置为0并向右移位1个索引,同时将索引0设为'1'。
原问题代码
if(carry == 1){ arr[len]='0'; for(i=len;i>0;i--){ arr[i] = arr[i-1]; // arr[i+1] = arr[i] 可正常运行 } arr[0]='1'; }
遇到的问题
输入9999时,输出结果为10000m、10000k或10000o这类带乱码的异常值。将arr[i] = arr[i-1];改为arr[i+1] = arr[i]后运行正常,但数组长度比最后一个字符的索引大1,为何必须用i+1而非i?
问题原因与解答
1. 数组索引的基本规则
先明确:数组长度n对应的合法索引范围是0到n-1——也就是你说的“数组长度比最后一个字符的索引大1”。比如存储输入9999的数组,若长度为4,合法索引是0~3;要存结果10000,数组长度至少得是5,合法索引0~4。
2. 原代码的逻辑错误
你要实现的是所有元素向右移位一位,再在开头插入'1',原代码的赋值方向完全搞反了:
- 原循环
for(i=len;i>0;i--)执行arr[i] = arr[i-1],是把前一位的值覆盖当前位,相当于元素向左移,而不是向右移。 - 若
len是原数组最后一个元素的索引(比如3),执行后会把arr[2]的9覆盖arr[3],arr[1]的9覆盖arr[2]……最终数组变成['1','9','9','9'],加上你提前设的arr[len]='0'(若len=4则是数组的第5位),此时数组末尾如果没有字符串终止符'\0',输出时会读取内存中数组后面的随机垃圾数据,也就是你看到的m/k/o这类乱码。
3. 为什么arr[i+1] = arr[i]能正常运行
改成arr[i+1] = arr[i]后,赋值方向变成把当前位的值移到后一位,这才是正确的右移逻辑:
- 假设循环从原数组最后一个有效索引(比如
3)开始向前遍历,执行arr[4] = arr[3]、arr[3] = arr[2]……就能把原数组的所有元素依次向右挪一位,空出arr[0]的位置。 - 此时再把
arr[0]设为'1',就能得到正确的10000;只要数组长度足够(能容纳5位字符加终止符),就不会出现越界读取乱码的问题。
内容的提问来源于stack exchange,提问作者ashutosh
相关产品推荐
相关产品推荐

