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

