动态数组复制后输出不全且数值异常?求原因及修复方案
问题原因
- 循环次数计算错误:
sizeof(num_array_1)获取的是指针变量本身的大小(而非数组元素总数),32位系统下是4字节,64位是8字节,导致循环无法遍历完整数组;若指针大小超过实际元素数,还会越界访问内存,出现异常值。 - 内存复制字节数错误:
memcpy的第三个参数是总字节数,double类型在绝大多数系统中占8字节,你用4 * n只复制了一半字节,导致后续元素数据不完整,解析成double时出现异常数值。 - 变量重定义问题:在
array_transform函数内重新定义了与参数同名的num_array_1,会覆盖参数指针,导致操作逻辑混乱。
修复方法
- 修正循环遍历长度:动态数组无法通过指针获取元素个数,需将元素总数作为参数传入函数:
void array_transform(double* num_array_1, int n) { for (int i = 0; i < n; i++) { cout << num_array_1[i] << endl; } }
- 修正memcpy字节数:使用
sizeof(double) * n计算总复制字节数,确保完整复制所有元素:
double* num_array_copy = new double[n]; memcpy(num_array_copy, num_array, sizeof(double) * n);
也可以用循环逐个赋值替代memcpy,避免字节数计算错误:
double* num_array_copy = new double[n]; for(int i = 0; i < n; i++){ num_array_copy[i] = num_array[i]; }
- 避免变量重定义:重新命名复制后的数组指针,避免与函数参数或其他变量同名,比如用
num_array_copy替代原重定义的num_array_1。
修复后示例代码
#include <iostream> #include <cstring> using namespace std; void array_transform(double* num_array, int n) { for (int i = 0; i < n; i++) { cout << num_array[i] << endl; } } int main() { int n = 10; double* num_array = new double[n]{42,68,35,1,70,25,79,59,63,65}; // 复制数组 double* num_array_copy = new double[n]; memcpy(num_array_copy, num_array, sizeof(double)*n); // 输出复制后的数组 cout << "Copied array elements:" << endl; array_transform(num_array_copy, n); // 释放内存 delete[] num_array; delete[] num_array_copy; return 0; }
内容的提问来源于stack exchange,提问作者Olga Puzikova
相关产品推荐
相关产品推荐

