首页 > 代码库 > 关于函数返回值为指针类型的分析
关于函数返回值为指针类型的分析
注意(原则):永远不要返回一个局部变量的指针或引用(其实是隐式的指针),可以返回局部变量本身,因为函数执行完之后,将释放分配给局部变量的存储空间,局部变量只是临时的存储空间,此时,对局部变量的引用和地址就会返回不确定的内存。
抓住这个原则,我们来看一下例子:
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
关于函数返回值为指针类型的分析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。