初学数据结构用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
相关产品推荐
相关产品推荐

