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

原文地址:https://www.cnblogs.com/walter-xh/p/6192800.html