c++ 为什么一个子程序的变量正在访问另一个子程序的值?

von4xj4u  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(102)

为什么为变量'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;
    }
ulmd4ohb

ulmd4ohb1#

这是因为你没有在第二个函数中初始化b,这意味着它将有一些任意值。在本例中,它得到的值似乎是上一个函数中a的值。
当你调用一个函数时,它会调整堆栈指针,使它有一个与调用者main()分离的堆栈框架。调用a()可以做到这一点,然后它会将堆栈帧中的某个内存位置(用于局部变量a)设置为743
当我们然后 exita()时,我们调整堆栈指针,以便我们再次使用main()的堆栈帧,但***我们不清除***a()堆栈帧所在的内存。
然后,在调用b()时,我们调整了堆栈框架,考虑到两个函数之间的相似性(相同数量的参数,相同数量的局部变量等),b的内存位置恰好是a执行时的位置。
这就是为什么它具有相同的值。
请记住,这只是由于您所拥有的特定场景,并且不受标准的保证。当你使用b而没有初始化它的时候,你肯定会得到一些任意的值。
底线是,在你尝试使用它们之前初始化你的变量。

相关问题