C++局部变量为何跨函数取值?Dev-C++运行异常问询
为什么局部变量
rad会获取到另一个局部变量radius的值? 我在Dev-C中运行以下C代码:
#include <iostream> using namespace std; #include <conio.h> void getdata(); void dis(); void getdata() { int radius; cout<<"\n enter radius of circle:-"; cin>>radius; } void dis() { int rad; cout<<"\n num is "<<rad; } int main() { //int radius; getdata(); dis(); getch(); return 11; }
运行输出为:
enter radius of circle:-15 num is 15
我的疑问是:radius和rad均为各自函数的局部变量,为何rad会获取到radius的值?
这其实是未定义行为带来的巧合,不是C++语言的特性,更不是必然会发生的结果。
咱们来拆解一下背后的原因:
- 局部变量是分配在栈内存上的。当你调用
getdata()时,函数会在栈上为radius开辟一块内存空间,你输入的15就存在这里。 - 当
getdata()执行完毕返回后,它的栈帧会被销毁,但栈上的这块内存并不会被主动清零——里面的值还留在那里,只是不再被程序“合法”访问了。 - 紧接着调用
dis(),函数又会在栈上为rad开辟空间。在Dev-C++默认的编译环境(比如使用旧版MinGW编译器、没有开启优化)下,rad刚好被分配到了之前radius占用的那块栈内存位置,所以它就“捡到”了之前留下的15。
但一定要注意:这种情况完全是随机的!如果换个编译器(比如GCC高版本、MSVC),或者开启了编译优化,或者在getdata()和dis()之间加了其他函数调用,rad的值可能就是一个完全随机的垃圾值,甚至程序可能出现奇怪的崩溃。
正确的做法应该是通过参数传递或者返回值来传递数据,比如修改代码:
#include <iostream> using namespace std; #include <conio.h> int getdata(); void dis(int rad); int getdata() { int radius; cout<<"\n enter radius of circle:-"; cin>>radius; return radius; } void dis(int rad) { cout<<"\n num is "<<rad; } int main() { int radius = getdata(); dis(radius); getch(); return 0; }
这样就能保证数据传递是合法且可预期的,不会依赖那些不可靠的栈内存巧合。
内容的提问来源于stack exchange,提问作者Sandeep Chetia
相关产品推荐
相关产品推荐

