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
相关产品推荐
相关产品推荐

