walter_xh

来源:互联网 发布:stc15单片机 编辑:程序博客网 时间:2024/06/08 14:57

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++函数返回值和参数调用想了解更多,可以点 这里 。

 

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

0 0
原创粉丝点击