You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:18:17