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

C++通过指针实现整型数组拷贝的函数输出异常问题排查

问题说明

以下代码中的Copy函数目标是用C++指针实现整型数组从源数组到目标数组的拷贝,但实际运行输出不符合预期:

#include <iostream>

using namespace std;
void Copy(int old_array[],int new_array[],int length)
{
    int *ptr1 = old_array;
    int *ptr2 = new_array;
    int i = 0;
    for(int i=0 ; i<length ; i++)
    {
        *(ptr2++) = *(ptr1++);
    }
    for (int i = 0; i <2; i++)
    {
        cout<<*(ptr2 + i)<<endl;
    }
}
int main()
{
    int a[2]={0,1};
    int b[2];
    Copy(a,b,2);
}

程序实际运行输出截图:
运行输出截图

错误原因

核心错误是指针偏移后未复位,引发数组越界访问:

  • 拷贝循环执行过程中,每完成一次元素赋值,ptr1和ptr2都会做一次自增操作。当length为2的数组拷贝完成时,ptr2已经移动到了目标数组new_array末尾之后的内存位置,不再指向数组起始地址。
  • 后续的打印循环直接从ptr2当前指向的越界位置开始读取内存,读到的是栈空间里未初始化的随机垃圾值,不是之前拷贝进数组的有效数据,属于C++标准里定义的未定义行为,输出结果完全不可预期。
  • 代码还存在两处冗余问题:一是函数开头定义的int i = 0;从未被使用,两个for循环内都重新定义了作用域仅限循环内部的局部变量i,外层i属于无效冗余代码;二是打印循环里硬编码长度2,没有使用传入的length参数,可维护性差。
修正方法

拷贝完成后先将ptr2复位到目标数组的首地址,再执行打印操作即可,修正后代码:

#include <iostream>

using namespace std;
void Copy(int old_array[],int new_array[],int length)
{
    int *ptr1 = old_array;
    int *ptr2 = new_array;
    for(int i=0 ; i<length ; i++)
    {
        *(ptr2++) = *(ptr1++);
    }
    // 关键修正:将目标指针复位到数组起始位置
    ptr2 = new_array;
    for (int i = 0; i < length; i++)
    {
        cout<<*(ptr2 + i)<<endl;
    }
}
int main()
{
    int a[2]={0,1};
    int b[2];
    Copy(a,b,2);
}

修正后运行将正确输出拷贝结果:

0
1

内容的提问来源于stack exchange,提问作者dididi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:39:17