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

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。
  • 移位逻辑边界错误:就算先不管越界问题,当前循环的终止条件也不对,左移一位时只需要遍历到倒数第二个元素就行,访问最后一个元素的后一位必然越界。

你现在的运行结果完全对应越界后的执行流程:

  1. i=0时,arr[0] = arr[1] → 原arr[1]的值2覆盖arr[0]
  2. i=1时,arr[1] = arr[2] → 原arr[2]的值3覆盖arr[1]
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:54:23