如何在C++中访问其他函数内创建的数组?
如何在C++中访问另一个函数内创建的数组?
首先得指出你当前代码里的核心问题:你在arr_test函数里创建的arr是栈上的局部数组,当函数执行完毕返回时,这个数组所在的栈帧会被销毁,内存会被系统回收或者被后续的函数调用覆盖。所以你返回这个数组的指针后,在main里去访问它的内容属于未定义行为——程序可能看起来偶尔能运行,但随时会崩溃或者输出错误结果,你看到的输出截断就是这个问题的表现。
下面是几种正确的解决方案,按推荐程度排序:
1. 使用std::vector(最推荐)
C++标准库的std::vector是动态数组的绝佳替代品,它会自动管理内存,不用手动分配和释放,既安全又简洁。修改后的代码如下:
#include <iostream> #include <vector> using namespace std; vector<int> arr_test(int n) { vector<int> arr(n); for (int i = 0; i < n; i++) cin >> arr[i]; for(int i = 0; i < n; i++) cout << "old array " << arr[i] << endl; return arr; } int main() { int n; cin >> n; vector<int> new_arr = arr_test(n); for (int i = 0; i < n; i++) new_arr[i]++; for(int i = 0; i < n; i++) cout << "new array " << new_arr[i] << endl; return 0; }
这里arr_test直接返回vector对象,C++会自动优化这个返回过程(RVO),不会产生额外的性能开销,而且vector的内存会在它离开作用域时自动释放,完全不用担心内存泄漏。
2. 使用动态内存分配(new/delete[])
如果你一定要用指针风格的数组,可以在arr_test里用new在堆上分配内存,这样内存不会随函数返回而销毁,但记得用完后必须用delete[]释放,否则会造成内存泄漏:
#include <iostream> using namespace std; int* arr_test(int n) { int* arr = new int[n]; // 在堆上分配内存 for (int i = 0; i < n; i++) cin >> arr[i]; for(int i = 0; i < n; i++) cout << "old array " << arr[i] << endl; return arr; } int main() { int n; cin >> n; int* new_arr = arr_test(n); for (int i = 0; i < n; i++) new_arr[i]++; for(int i = 0; i < n; i++) cout << "new array " << new_arr[i] << endl; delete[] new_arr; // 必须释放堆内存 return 0; }
这种方式需要手动管理内存,容易出错,所以除非有特殊需求,否则优先用std::vector。
3. 由调用者提供数组
另一种方式是在main里创建数组(不管是栈上还是堆上),然后把数组指针和大小传给arr_test,让函数直接填充这个数组:
#include <iostream> using namespace std; void arr_test(int* arr, int n) { for (int i = 0; i < n; i++) cin >> arr[i]; for(int i = 0; i < n; i++) cout << "old array " << arr[i] << endl; } int main() { int n; cin >> n; int new_arr[n]; // 栈上数组,注意:变长数组(VLA)是C99特性,不是标准C++,部分编译器支持但不推荐 // 或者用动态分配:int* new_arr = new int[n]; arr_test(new_arr, n); for (int i = 0; i < n; i++) new_arr[i]++; for(int i = 0; i < n; i++) cout << "new array " << new_arr[i] << endl; // 如果是动态分配,记得delete[] new_arr; return 0; }
注意:栈上的变长数组(int new_arr[n])是C99的特性,不属于标准C++,虽然很多编译器支持,但移植性不好,所以如果要在栈上创建数组,最好用编译期确定的大小,或者还是用std::vector。
内容的提问来源于stack exchange,提问作者demiurge conon
相关产品推荐
相关产品推荐

