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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:00:46