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

C++合并两个数组为一个数组时值异常复制问题解决方法

C++ 数组合并时元素拷贝异常修复方案

问题表现

实现两个长度为9的整型数组、合并到长度为18的目标数组时,目标数组中本应存储第二个数组元素的后半段,错误出现了第一个数组的重复值,合并结果不符合预期。
原错误实现代码如下:

#include<iostream>

using namespace std;

int main()
{
    int arr1[9], arr2[9], arr3[18];
    // 生成arr1随机值
    for(int i = 0; i < 9; i++) {
        arr1[i] = rand()%100;
    }

    // 生成arr2随机值
    for(int i = 0; i < 9; i++) {
        arr2[i] = rand()%100;
    }

    // 输出arr1
    cout << "arr1 = ";
    for(int i = 0; i < 9; i++) {
        cout << arr1[i] << " ";
    }
    cout << "\n";

    // 输出arr2
    cout << "arr2 = ";
    for(int i = 0; i < 9; i++) {
        cout << arr2[i] << " ";
    }
    cout << "\n";

    // 合并arr1、arr2到arr3
    for(int i = 0; i < 9; i++) {
        arr3[i] = arr1[i];
    }
    for(int i = 9; i < 18; i++) {
        arr3[i] = arr2[i];
    }

    // 输出合并结果arr3
    cout << "arr3 = ";
    for(int i = 0; i < 18; i++) {
        cout << arr3[i] << " ";
    }
    cout << "\n";
    
    return 0;
}

异常原因

该异常由数组索引越界引发的非法内存访问导致:

  • 长度为9的数组arr2合法索引范围为0~8
  • 原代码拷贝第二个数组到目标数组时,循环变量i取值范围为9~17,直接使用i作为索引访问arr2,完全超出了arr2的内存边界
  • 三个数组在栈空间连续分配,越界访问arr2[9]~arr2[17]时,实际读取到的是栈上相邻位置存储的arr1数据,最终导致合并结果后半段重复出现第一个数组的值

修复方案

调整第二个拷贝循环中arr2的索引计算逻辑:拷贝目标数组第9位及之后的元素时,arr2的索引需要从0开始计数,做偏移计算即可。
将原拷贝逻辑中的:

arr3[i] = arr2[i];

修改为:

arr3[i] = arr2[i - 9];

修正后完整可运行代码如下:

#include<iostream>

using namespace std;

int main()
{
    int arr1[9], arr2[9], arr3[18];
    // 生成arr1随机值
    for(int i = 0; i < 9; i++) {
        arr1[i] = rand()%100;
    }

    // 生成arr2随机值
    for(int i = 0; i < 9; i++) {
        arr2[i] = rand()%100;
    }

    // 输出arr1
    cout << "arr1 = ";
    for(int i = 0; i < 9; i++) {
        cout << arr1[i] << " ";
    }
    cout << "\n";

    // 输出arr2
    cout << "arr2 = ";
    for(int i = 0; i < 9; i++) {
        cout << arr2[i] << " ";
    }
    cout << "\n";

    // 合并arr1、arr2到arr3
    for(int i = 0; i < 9; i++) {
        arr3[i] = arr1[i];
    }
    for(int i = 9; i < 18; i++) {
        arr3[i] = arr2[i - 9];
    }

    // 输出合并结果arr3
    cout << "arr3 = ";
    for(int i = 0; i < 18; i++) {
        cout << arr3[i] << " ";
    }
    cout << "\n";
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:06:42