函数返回指针时,不能返回临时变量的地址: 代码如下,
#include<iostream>
#include<Windows.h>
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<iostream>
#include<Windows.h>
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<iostream>
#include<Windows.h>
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<iostream>
#include<Windows.h>
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;
}
|