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