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
相关产品推荐
相关产品推荐

