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

初学数据结构用C++仿vector实现数组头部插入 出现垃圾值

代码出现垃圾值的核心问题
  • 指针传递机制踩坑:C++函数传普通指针时,传递的是指针值的拷贝,你在insertAtFront内部把局部变量arr指向新数组temp,这个修改根本传导不到main函数里的原arr指针。更严重的是,你在函数里用delete[]释放了原数组的内存后,main里的arr还指着这块已经被操作系统回收的无效内存,后续读这个地址的值就是未定义行为,出现垃圾值是必然的。
  • 移位逻辑写反了起点:就算指针传递的问题解决了,你写的移位循环从i = n-2开始跑,会直接把新数组最后一个位置(也就是原数组最后一个元素)覆盖掉,根本没完成正确的整体后移。正确的移位应该从新数组里存储的最后一个旧元素开始,也就是i从n-1开始,逐一把每个位置的元素往后挪一位,才不会出现覆盖丢失的问题。
  • 代码里temp[n] = 0的初始化完全多余,后续移位操作本来就会把这个位置填上原数组的最后一个元素,赋值0没有任何实际作用。
修正后的可运行代码
#include <iostream>
using namespace std;

// 用指针引用传递,让函数可以直接修改main函数里的原指针指向
void insertAtFront(int*& arr, int n, int element)
{
    int* temp = new int[n + 1];
    // 把原数组的所有元素拷贝到新数组
    for(auto i = 0; i < n; ++i)
    {
        temp[i] = arr[i];
    }
    // 释放原数组的堆内存
    delete[] arr;
    // 从最后一个旧元素开始,整体后移一位空出头部位置
    for(int i = n - 1; i >= 0; --i)
    {
        temp[i + 1] = temp[i];
    }
    // 在空出的头部位置插入新元素
    temp[0] = element;
    // 把新数组的地址赋值给外部的原指针
    arr = temp;
}


int main()
{
    int* arr = new int[10];
    for(int i = 0; i < 10; ++i)
    {
        arr[i] = i + 1;
    }
    cout << "Enter element to insert: ";
    int element;
    cin >> element;
    insertAtFront(arr, 10, element);

    for(int i = 0; i < 11; ++i)
        cout << arr[i] << " ";
    
    // 程序退出前释放最终的数组内存,避免内存泄漏
    delete[] arr;
    return 0;
}

补充:如果不想用指针引用的传参方式,也可以改成二级指针传参,也就是形参写int** arr,调用时传&arr,函数内部通过*arr = temp的方式修改外部指针的指向,逻辑是完全一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 20:06:02