zoukankan      html  css  js  c++  java
  • 关于函数返回值为指针类型的分析

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

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

    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

  • 相关阅读:
    从头来之【图解针对虚拟机iOS开发环境搭建】 (转)
    换工作?请记得8、18、48与72这四个密码(转)
    php
    linux上svn连接visual svn server时ssl鉴权失败,问题解决(转)
    javamail发送邮件的简单实例(转)
    稀疏矩阵
    Redis11种Web应用场景
    说说ShellExecuteEx
    怎样从host之外连接到docker container
    hadoop日志分析
  • 原文地址:https://www.cnblogs.com/fah936861121/p/6869129.html
Copyright © 2011-2022 走看看