函数返回指针时,不能返回临时变量的地址:
代码如下,
#include#include using namespace std; int *add1(int x, int y) { int sum = x + y; return ∑ } int main(void) { int a = 3; int b = 5; int *sum = NULL; sum = add1(a, b); cout << *sum << endl; system("pause"); return 0; }
看上去没问题,执行一下,
看上去可以啊,但是,函数add1里面的变量是局部变量,临时变量,只在函数调用执行的过程中才存在,执行完之后,就已经在栈空间释放了,不存在了,现在只调用了add1一个函数,再加一个函数执行看看:
#include#include using namespace std; int *add1(int x, int y) { int sum = x + y; return ∑ } int *add2(int x, int y) { static int sum = 0; sum = x + y; return ∑ } int main(void) { int a = 3; int b = 5; int *sum = NULL; sum = add1(a, b); add2(a, b); cout << *sum << endl; system("pause"); return 0; }
执行,
打印出的数据不知道什么?看不懂。为什么会这样?
程序执行函数add1时,add1中的变量进入栈空间,执行完之后在栈空间中消失,函数add2开始执行,add2中的变量开始进栈空间,覆盖掉add1时的数据,该打印的数据8被覆盖掉,成了不知道是什么的数据。栈空间可以重复被利用。
那么,怎么解决?
办法有很多,这里使用两种方式:
第一种:
采用静态变量,静态变量的存储期是全局的,整个main函数执行完才被 *** 作系统释放
#include#include using namespace std; int *add1(int x, int y) { int sum = x + y; return ∑ } int *add2(int x, int y) { static int sum = 0; sum = x + y; return ∑ } int main(void) { int a = 3; int b = 5; int *sum = NULL; sum = add2(a, b); cout << *sum << endl; system("pause"); return 0; }
第二种:
使用堆空间,使用动态内存的方式,来随用随取,再释放
#include#include using namespace std; int *add1(int x, int y) { int sum = x + y; return ∑ } int *add3(int x, int y) { int *sum = NULL; sum = new int; *sum = x + y; return sum; } int main(void) { int a = 3; int b = 5; int *sum = NULL; sum = add3(a, b); cout << *sum << endl; delete sum; system("pause"); return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)