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

C++传递未知大小数组指针,函数实现扩容填充的方法咨询

这个需求在C++里其实有几种靠谱的实现方式,我给你拆解一下,从原生数组的手动管理到更现代的容器方案都有:

方案1:使用指针的指针(或指针引用)手动管理内存

如果一定要用原生数组指针来做,核心是让函数能修改外部的指针和数组大小——普通指针传参是值传递,函数里修改指针不会影响外部,所以得用**指针或者指针的引用。

举个代码例子:

#include <iostream>
#include <cstring> // 用于memcpy

// 扩容并填充数组的函数
void expandAndFillArray(int** arr, size_t& currentSize, size_t newSize) {
    // 分配新的内存空间
    int* newArr = new int[newSize];
    
    // 复制原来的数组数据(如果原来有数据的话)
    if (*arr != nullptr && currentSize > 0) {
        memcpy(newArr, *arr, currentSize * sizeof(int));
    }
    
    // 填充新的元素(这里示例填充100到新位置)
    for (size_t i = currentSize; i < newSize; ++i) {
        newArr[i] = 100;
    }
    
    // 释放原来的内存,避免泄漏
    delete[] *arr;
    
    // 更新外部的指针和大小
    *arr = newArr;
    currentSize = newSize;
}

int main() {
    int* myArr = nullptr;
    size_t arrSize = 0;
    
    // 扩容到5个元素并填充
    expandAndFillArray(&myArr, arrSize, 5);
    
    // 打印结果
    for (size_t i = 0; i < arrSize; ++i) {
        std::cout << myArr[i] << " ";
    }
    std::cout << std::endl;
    
    // 再次扩容到10个元素
    expandAndFillArray(&myArr, arrSize, 10);
    for (size_t i = 0; i < arrSize; ++i) {
        std::cout << myArr[i] << " ";
    }
    std::cout << std::endl;
    
    // 记得最后释放内存
    delete[] myArr;
    return 0;
}

这里要注意:

  • 必须用new[]和delete[]配对,别和C的malloc/free混用,否则会触发未定义行为
  • 如果原来的数组是空指针(初始状态),要做好判断,避免复制出错
方案2:用std::vector(极度推荐!)

其实在C++里,原生数组手动管理内存很容易踩坑(比如忘记释放、内存泄漏、越界访问),更优雅的方式是用标准库的std::vector。它会自动处理扩容、内存管理,函数只要传引用就能直接修改。

代码示例简单多了:

#include <iostream>
#include <vector>

void expandAndFillVector(std::vector<int>& vec, size_t newSize) {
    // 直接扩容到目标大小,新元素默认初始化(如果需要自定义填充可以改)
    vec.resize(newSize);
    
    // 填充新的元素(比如从原来的大小开始填充为200)
    size_t oldSize = vec.size() - (newSize - vec.size());
    for (size_t i = oldSize; i < newSize; ++i) {
        vec[i] = 200;
    }
    // 或者更简单的追加方式:
    // for (size_t i = 0; i < newSize - vec.size(); ++i) {
    //     vec.push_back(200);
    // }
}

int main() {
    std::vector<int> myVec;
    
    // 扩容到5个元素
    expandAndFillVector(myVec, 5);
    for (int num : myVec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    // 再次扩容到10个元素
    expandAndFillVector(myVec, 10);
    for (int num : myVec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    
    // 不用手动释放内存,vector会自动处理
    return 0;
}

这种方式几乎没有内存泄漏的风险,代码也简洁很多,是C++里处理动态数组的首选方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:38:25