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

  • 相关阅读:
    用于 webpack 打包后方便修改的配置文件
    antd 中对树形表格中二级元素进行筛选过滤
    layui快速搭建一个后台管理系统
    centos使用shell定时清空缓存
    内存异常原因查询
    Protocol "‘https" not supported or disabled in libcurl
    HTML table标签实现表头固定
    vue 查询某个对象在对象列表的索引位置
    vue 实现页面监听键盘按键 上下左右
    Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能
  • 原文地址:https://www.cnblogs.com/walter-xh/p/6192800.html
Copyright © 2011-2022 走看看