在程序设计中,我们会定义一些临时的变量,这些临时变量只有在使用到它的时候系统才会在栈里给它分配空间,当使用过后,系统会在栈里收回它所占用的空间,这样它就消失了。在下面的例子中,在num &test(num &p)函数中,定义了一个tmp结构体变量,而且在函数的结束,我也让他返回了对它的引用,按照上面的说法,就是函数执行完之后,临时变量就没有了,那么:
q=test(t);
cout<<"q.m="<<q.m<<endl
<<"q.n="<<q.n<<endl;
这里的输出应该是有问题的,但是运行之后,只是出现了一个警告:
Yin_yong.cpp: 在函数‘num& test(num&)’中:
Yin_yong.cpp:34:6: 警告: 返回了对局部变量的‘tmp’的引用 [默认启用]
代码如下:
#include <iostream>
using namespace std;
struct num
{
int m;
int n;
};
num &test(num &); //声明一个函数,返回对其的引用
int main()
{
num t,q;
t.m=98;
t.n=100;
cout<<"t.m="<<t.m<<endl
<<"t.n="<<t.n<<endl;
q=test(t);
//在这里大量的分配栈空间,进行清空操作
cout<<"q.m="<<q.m<<endl<<"q.n="<<q.n<<endl;
return 0;
}
num &test(num &p)
{
num tmp;
tmp.m=500;
tmp.n=500;
return tmp;
}
运行输出结果:
chenyu@chenyu-virtual-machine:~/chenyu/c++/1-2$ ./test
t.m=98
t.n=100
q.m=500
q.n=500
可以看出,这里没有出现问题。按照预定的目的输出结果,这又是为什么呢》?
在网上查了一下,这里tmp所占用的栈空间没有被销毁,它还在那里存在着,所以在这个程序里,它没有出现问题。
但是如果在程序中红的的部分前面大量的分配栈空间,那么输出的结果就不一定了.