关于函数返回值为指针类型的分析
Posted 大海中的一粒沙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于函数返回值为指针类型的分析相关的知识,希望对你有一定的参考价值。
注意(原则):永远不要返回一个局部变量的指针或引用(其实是隐式的指针),可以返回局部变量本身,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存。
抓住这个原则,我们来看一下例子:
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 ∑ } int main() { int a = 3, b = 5; cout << *add(a, b) << endl; }
会出现以下警告:
warning: function returns address of local variable [-Wreturn-local-addr]
return ∑
^
警告:函数返回地址是局部变量地址--->这是不安全的
该如何解决这种错误呢?
方案有以下3中常用方案:
1.使用静态变量
2.使用全局变量
3.申请堆区变量
其实,使用这三种方法是为了延长变量的声明周期,从而达到返回的地址是确定的而不是不确定的
法1:
int* add(int x, int y) { static int sum; sum = x + y; return ∑ }
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
以上是关于关于函数返回值为指针类型的分析的主要内容,如果未能解决你的问题,请参考以下文章