C++实现数组元素左移后arr[2]位置输出1是什么原因?
问题原因
你遇到的arr[2]输出1的问题,核心是几个代码错误共同导致的:
- 数组越界访问:移位循环中
i从0递增到2(满足i<3的判断条件),当i=2时会执行arr[2] = arr[3]。如果数组实际长度为3,合法索引只有0、1、2,arr[3]指向数组边界外的栈内存,这个位置存的是程序运行时栈上残留的无意义数据,值完全不确定,你本次运行刚好读到1,换编译参数、运行环境可能出现任意随机值,是C++里典型的未定义行为,结果完全不可预期。 - 基础语法问题:原代码里
int array[n] = {5,2,3};的写法本身就过不了编译,n是没声明过的标识符,推测是你写代码时误把数组长度3写成了未定义的n。 - 移位逻辑边界错误:就算先不管越界问题,当前循环的终止条件也不对,左移一位时只需要遍历到倒数第二个元素就行,访问最后一个元素的后一位必然越界。
你现在的运行结果完全对应越界后的执行流程:
- i=0时,
arr[0] = arr[1]→ 原arr[1]的值2覆盖arr[0] - i=1时,
arr[1] = arr[2]→ 原arr[2]的值3覆盖arr[1] - i=2时,
arr[2] = arr[3]→ 读到栈上残留值1,覆盖arr[2]
最后输出自然就是2、3、1。
修正方案
调整数组定义、循环边界,按左移需求补全末尾赋值逻辑即可,参考代码如下:
#include <iostream> using namespace std; // 传入数组长度,避免硬编码长度值 void shifting(int* arr, int len) { // 如果是循环左移需要暂存第一个移出的元素,普通左移可以删掉这行 // int first_val = arr[0]; for (int i = 0; i < len - 1; i++) { arr[i] = arr[i + 1]; } // 左移后末尾位置按需求赋值:普通左移一般补0,循环左移把之前暂存的首元素放这里就行 arr[len - 1] = 0; // 循环左移替换为 first_val 即可 for (int i = 0; i < len; i++) { cout << arr[i] << endl; } } int main() { // 明确定义数组长度,不要用未声明的变量作为数组长度 int array[3] = { 5, 2, 3 }; shifting(array, 3); return 0; }
按上述普通左移逻辑运行,输出结果为:
2
3
0
如果改成循环左移逻辑,输出结果为:
2
3
5
内容的提问来源于stack exchange,提问作者krish
相关产品推荐
相关产品推荐

