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

动态数组复制后输出不全且数值异常?求原因及修复方案

问题原因
  • 循环次数计算错误:sizeof(num_array_1)获取的是指针变量本身的大小(而非数组元素总数),32位系统下是4字节,64位是8字节,导致循环无法遍历完整数组;若指针大小超过实际元素数,还会越界访问内存,出现异常值。
  • 内存复制字节数错误:memcpy的第三个参数是总字节数,double类型在绝大多数系统中占8字节,你用4 * n只复制了一半字节,导致后续元素数据不完整,解析成double时出现异常数值。
  • 变量重定义问题:在array_transform函数内重新定义了与参数同名的num_array_1,会覆盖参数指针,导致操作逻辑混乱。
修复方法
  1. 修正循环遍历长度:动态数组无法通过指针获取元素个数,需将元素总数作为参数传入函数:
void array_transform(double* num_array_1, int n) {
    for (int i = 0; i < n; i++) {
        cout << num_array_1[i] << endl;
    }
}
  1. 修正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];
}
  1. 避免变量重定义:重新命名复制后的数组指针,避免与函数参数或其他变量同名,比如用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:21:13