• 关于函数返回值为指针类型的分析


    注意(原则):永远不要返回一个局部变量的指针或引用(其实是隐式的指针),可以返回局部变量本身,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存。

    抓住这个原则,我们来看一下例子:

    1.返回变量本身

    //这个返回变量本身内存可以,正确
    int add(int x, int y)
    {
        int sum = x + y;
        return sum;
    }
    
    int main()
    {
        int a = 3, b = 5;
        cout << add(a, b) << endl;
    }

    2.返回局部变量指针,用法错误

    int* add(int x, int y)
    {
        int sum = x + y;
        return &sum;    
    }
    
    int main()
    {
        int a = 3, b = 5;
        cout << *add(a, b) << endl;
    }

    会出现以下警告: 

    warning: function returns address of local variable [-Wreturn-local-addr]

    return &sum;
    ^

    警告:函数返回地址是局部变量地址--->这是不安全的

    该如何解决这种错误呢?

    方案有以下3中常用方案:

    1.使用静态变量

    2.使用全局变量

    3.申请堆区变量

    其实,使用这三种方法是为了延长变量的声明周期,从而达到返回的地址是确定的而不是不确定的

    法1:

    int* add(int x, int y)
    {
        static int sum;
        sum = x + y;
        return &sum;
    }
    int main()
    {
        int a = 3, b = 5;
        cout << *add(a, b) << endl;
    }

    法2:

    int sum;
    
    int& add(int x, int y)
    
    {
        sum = x + y;
        return sum;
    }
    int main()
    {
        int a = 3, b = 5;
        cout << *add(a, b) << endl;
    }

    法3:

    int* add(int x, int y)
    
    {
      int* sum = new int;
      *sum = a + b;
      return sum;
    }

    int main()
    {
        int a = 3, b = 5;
       int *result;
       result = add(a, b); cout << *result << endl;
       delete result; }

    法3需要注意,由于用new申请的动态内存,调用者(这里是main)需要释放这个申请的指针free, delete

    参考:http://blog.chinaunix.net/uid-20788636-id-1841283.html

  • 相关阅读:
    模拟费用流学习笔记
    爬山游记
    基数排序板子
    webim
    centos9 重启网络
    Linux虚拟机桥接模式下ping不通自己配置的网关
    win7怎样开启loopback接口(环回网卡)
    在CentOS上配置SAMBA共享目录
    linux间scp拷贝文件夹
    nginx配置http和https可同时访问方法
  • 原文地址:https://www.cnblogs.com/fah936861121/p/6869129.html
Copyright © 2020-2023  润新知