C++使用指针在数组指定位置插入元素的实现问题求助
C++ 指针实现数组指定位置插入元素修复方案
原有代码问题
- 不符合C标准规范:
int a[size];是C语言的可变长度数组特性,标准C要求数组长度为编译期常量,运行时动态长度数组需要用堆内存分配实现。 - 数组无扩展空间:原有数组在栈上申请,空间固定为初始输入的size,插入元素必然会越界改写其他内存,必须新申请长度+1的堆数组存储插入后的结果。
- 功能逻辑缺失:add函数仅实现了数组打印、定位尾元素的逻辑,没有插入元素的核心逻辑,且函数声明要求返回int*但没有return语句,会产生未定义行为。
- 语法错误:
int size = NULL;写法错误,NULL是指针空值常量,不能用于初始化int类型变量,直接初始化为0即可。
修正后可运行代码
#include <iostream> using namespace std; // 参数说明:原数组指针,原数组长度,插入位置(从0开始计数),待插入元素 int* insertAt(int* arr, int oldSize, int insertPos, int insertVal) { // 申请新数组空间,长度为原长度+1 int* newArr = new int[oldSize + 1]; int* pOld = arr; int* pNew = newArr; // 拷贝插入位置之前的元素 for (int i = 0; i < insertPos; i++) { *pNew = *pOld; pNew++; pOld++; } // 插入目标元素 *pNew = insertVal; pNew++; // 拷贝插入位置之后的剩余元素 for (int i = insertPos; i < oldSize; i++) { *pNew = *pOld; pNew++; pOld++; } // 释放原数组的堆内存 delete[] arr; return newArr; } int main() { int size = 0; cout << "Enter the size of the array: "; cin >> size; // 动态分配初始数组的堆内存 int* a = new int[size]; for (int i = 0; i < size; i++) { cin >> a[i]; } int insertPos, insertVal; cout << "Enter insert position (start from 0): "; cin >> insertPos; cout << "Enter value to insert: "; cin >> insertVal; // 插入元素,获取新数组指针 int* newArr = insertAt(a, size, insertPos, insertVal); // 打印插入后的数组 cout << "Array after insertion: "; for (int i = 0; i < size + 1; i++) { cout << newArr[i] << " "; } cout << endl; // 释放新数组内存 delete[] newArr; return 0; }
实现说明
- 全程使用指针偏移完成元素读写操作,符合用指针实现的要求
- 动态内存的申请和释放成对出现,不会产生内存泄漏
- 插入位置支持0到原数组长度区间,插入位置等于原数组长度时即为在数组末尾追加元素
内容的提问来源于stack exchange,提问作者Saad Ahmad
相关产品推荐
相关产品推荐

