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

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

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

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

posted @ 2017-05-17 19:03  大海中的一粒沙  阅读(5599)  评论(0编辑  收藏  举报