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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:24:00