为什么为变量'b'打印'a'的值?根据我的理解,子程序的变量是堆栈动态变量,子程序的内存单元在子程序开始执行时分配,在子程序结束执行时解除分配。(从-https://cse.buffalo.edu/~shapiro/Courses/CSE305/Notes/notes6.html获取此信息)如果我错了,请告诉我。
using namespace std;
void a(){
int a = 743;
cout<<a<<endl;
}
void b() {
int b;
cout<<b<<endl;
int main() {
a();
b();
return 0;
}
1条答案
按热度按时间ulmd4ohb1#
这是因为你没有在第二个函数中初始化
b
,这意味着它将有一些任意值。在本例中,它得到的值似乎是上一个函数中a
的值。当你调用一个函数时,它会调整堆栈指针,使它有一个与调用者
main()
分离的堆栈框架。调用a()
可以做到这一点,然后它会将堆栈帧中的某个内存位置(用于局部变量a
)设置为743
。当我们然后 exit
a()
时,我们调整堆栈指针,以便我们再次使用main()
的堆栈帧,但***我们不清除***a()
堆栈帧所在的内存。然后,在调用
b()
时,我们调整了堆栈框架,考虑到两个函数之间的相似性(相同数量的参数,相同数量的局部变量等),b
的内存位置恰好是a
执行时的位置。这就是为什么它具有相同的值。
请记住,这只是由于您所拥有的特定场景,并且不受标准的保证。当你使用
b
而没有初始化它的时候,你肯定会得到一些任意的值。底线是,在你尝试使用它们之前初始化你的变量。