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

C++动态数组插入元素时原有值被重置为0的问题咨询

代码错误原因
  • 未拷贝原有数组数据:insertAtBeginning方法中直接给arr重新分配全新的内存空间,没有将旧数组中的已有元素拷贝到新数组,原有数据直接丢失。新分配的内存值是未定义的,你遇到的0只是内存初始值的偶然表现。
  • 数组大小分配逻辑错误:插入元素前原数组长度为arr_size,新数组的长度应为arr_size + 1。但你的代码中arr = new int[arr_size++]是先使用当前的arr_size值分配数组,再对arr_size执行自增,导致分配的新数组长度比实际需要的少1。例如第一次插入时原arr_size=0,实际分配了长度为0的数组,自增后arr_size=1,后续操作直接访问越界内存。
  • 循环越界访问:arr_size自增后,新数组的合法下标范围是0 ~ arr_size-1,但你的循环for(int i=arr_size;i>0;i--)初始值直接取arr_size,访问arr[i]属于越界写操作,触发未定义行为。
  • 内存泄漏:每次重新分配数组内存时,没有释放旧数组的内存空间,造成内存资源泄漏。
  • 野指针风险:main函数中定义的int *arr没有初始化,是野指针,虽然首次插入会给它赋值,但存在潜在的非法访问风险。
修复方案

修正后的insertAtBeginning方法如下:

virtual void insertAtBeginning(int*& arr,int& arr_size,int val){
    // 保存旧数组指针和长度
    int* old_arr = arr;
    int old_size = arr_size;
    // 更新为新的数组长度
    arr_size++;
    // 分配足够长度的新数组
    arr = new int[arr_size];
    // 拷贝旧数组元素到新数组的对应位置
    for(int i = 0; i < old_size; i++){
        arr[i+1] = old_arr[i];
    }
    // 头部插入新元素
    arr[0] = val;
    // 释放旧数组的内存
    delete[] old_arr;
}

同时将main函数中的指针初始化改为int *arr = nullptr;即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:45:00