c++函数返回一个数组
Posted walter_xh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++函数返回一个数组相关的知识,希望对你有一定的参考价值。
调用某个函数时经常需要函数返回一个值,我们都知道c++ 的函数返回的是一个copy,所以当只返回一个值时不会出现什么问题,直接return一个copy就行了,但是如果返回一个数组,事情就变得有趣了,我最近就遇到了这个问题。
先附上代码吧:
#include<iostream> using namespace std; //函数声明 int * fun1(); int * fun2(); int * fun3(int * const buf); //buf 实际上是个传出参数,const表示buf的指向不能更改 void dispArr(int *arr ,int n); const int arrlen = 10; int main() { //方法一,返回局部变量的首地址 int * arr; arr = fun1(); cout << "这是方法一" << endl; //dispArr(arr, arrlen); //运行会报错 /*方法二,在函数内部通过new动态创建数组, 然后记得在main函数使用完数组后将其delete下*/ cout << "这是方法二" << endl; int *arr1; arr1 = fun2(); dispArr(arr1, arrlen); delete arr1; //方法三,由调用者自己申请缓存区和释放缓存区 cout << "这是方法三" << endl; int *arr2 = new int[arrlen]; int *ret = fun3(arr2); dispArr(arr2, arrlen); delete arr2; 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; } int *fun3(int* const buf) { if(buf==NULL) { cerr<<"error: null ptr @buf"<<endl; return NULL; } for(int i=0; i<arrlen; i++) { buf[i]=i; } return buf; } void dispArr(int* arr, int n) { for (int i = 0; i < n; i++) { cout << "arr" << "[" << i << "]" << " is:" <<arr[i]<<endl; } }
这是运行结果 :
这是方法一 Segmentation fault (core dumped) 这是方法二 arr[0] is:0 arr[1] is:1 arr[2] is:2 arr[3] is:3 arr[4] is:4 arr[5] is:5 arr[6] is:6 arr[7] is:7 arr[8] is:8 arr[9] is:9 这是方法三 arr[0] is:0 arr[1] is:1 arr[2] is:2 arr[3] is:3 arr[4] is:4 arr[5] is:5 arr[6] is:6 arr[7] is:7 arr[8] is:8 arr[9] is:9
通过一个函数创建一个数组,然后将数组的首地址返回,在主函数里将数组里的内容输出。拿到这个问题,像我这样初学者首先建立的思路是,你不是要我返回一个数组吗,我就返回一个数组的首地址给你啊,然后你根据这个地址去寻址,不就可以了吗。一开始我也这么想,因为我在java里就是这么干,所以很自然就想到了,然而是错的,而且是范了很傻的错误,因为在函数里创建的变量存储在栈里,函数返回将被自动释放,再返回一个地址,这个地址就指向了一个非法区域,程序报错。所以正确的方法是使用new的方式来申请一段位于堆区的内存,指针指向这段内存,函数返回时内存不会被释放掉;但需要注意使用完毕后delete相应的区域,养成良好的习惯。fun2的方法不好,因为调用者可能会不知道要delete,所以一般情况下是告诉调用者传入一个缓冲区的首地址给函数,函数返回该首地址,内存的申请和释放由调用者来做,如fun3。当然,一切都是浮云,STL才是王道。
总结一下
千万不要返回一个局部变量的指针或引用,会运行错误。 即使不错误,得到的指针所指内容在函数结束后就已经变了。
关于c++函数返回值和参数调用想了解更多,可以点 这里 。
以上是关于c++函数返回一个数组的主要内容,如果未能解决你的问题,请参考以下文章