首页 > 代码库 > c++函数返回一个数组

c++函数返回一个数组

---恢复内容开始---

 

调用某个函数时经常需要函数返回一个值,我们都知道c++ 的函数返回的是一个copy,所以当只返回一个值时不会出现什么问题,直接return一个copy就行了,但是如果返回一个数组,事情就变得有趣了,我最近就遇到了这个问题。


先附上代码吧:

#include<iostream>

using namespace std;

//函数声明
int * fun1();

int * fun2();

void dispArr(int *arr ,int n);

const int arrlen = 10;

int main()
{

    //方法一,返回局部变量的首地址
    int * arr;
    arr = fun1();
    cout << "这是方法一" << endl;

    dispArr(arr, arrlen);

    //cout << fun1()[1] << endl;//我们可以通过这样的方式将数组未被销毁的内容输出,但这样做没有意义

    /*方法二,在函数内部通过new动态创建数组,
     然后记得在main函数使用完数组后将其delete下*/
    cout << "这是方法二" << endl;
    int *arr1;
    arr1 = fun2();
    dispArr(arr1, arrlen);
    delete arr1;

    return 0;
}

//函数定义

int *fun1()
{
    int temp[arrlen];

    for (int i = 0; i < arrlen;++i)
    {
        temp[i] = i;
    }

    return temp;
}

int *fun2()
{
    int *temp = new int[arrlen];

    for (int i = 0; i < arrlen; i++)
    {
        temp[i] = i;
    }

    return temp;
}

void dispArr(int* arr, int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << "arr" << "[" << i << "]" << " is:" <<arr[i]<<endl;
    }
}

这是运行结果
技术分享

这里是废话

问题很简单啦,就是通过一个函数创建一个数组,然后将数组返回,并将数组里的内容打印到屏幕上。拿到这个问题,像我这样初学者首先建立的思路是,你不是要我返回一个数组吗,我就返回一个数组的首地址给你啊,然后你根据这个地址去寻址,不就可以了吗。一开始我也这么想,因为我在java里就是这么干,所以很自然就想到了,然而是错的,而且是范了很傻的错误,因为c++里的指针可不是java里的引用,c++里也没有GC(Garbage Collection),关于内存的事还得靠你自己,你自己。

这里是精华

错误原因:函数体内部创建的变量都是局部变量,当函数运行结束的时候,都会抛弃,也就是说你只返回了一个temp指针,这个指针确实是你想要的,这没有问题,但是它指向的内容在函数结束也就是return的那一刻之后就已经物是人非了。所以你用这个这个指针去访问的内容也不是你想要的内容了。
解决方法:动态内存分配,就是new和delete的配合使用。在函数里用new关键字创建一个数组,这样这块地址对应的内容就属于你管理了,再也不会在函数结束的时候被回收了,你也就可以通过返回的指针来访问数组了,最后再delete一下。

总结一下

千万不要返回一个局部变量的指针或引用,因为你返回也是没用的,得到的指针所指内容在函数结束后就已经变了。
关于c++函数返回值和参数调用想了解更多,可以点 这里 。

 

---恢复内容结束---

c++函数返回一个数组