首页 > 解决方案 > 为什么一个子程序的变量正在访问另一个子程序的值?

问题描述

代码示例

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

标签: variables

解决方案


这是因为您没有b在第二个函数中进行初始化,这意味着它将具有一些任意值。在这种情况下,它获得的值似乎是a前一个函数的值。

当您调用一个函数时,它会调整堆栈指针,使其具有与调用者分开的堆栈帧main()。调用会这样做a(),然后它将a在其堆栈帧中设置一些内存位置(用于局部变量)为743.

然后当我们退出 a()时,我们调整堆栈指针,以便我们再次使用堆栈帧,main()我们不会清除堆栈帧所在的内存a()

然后,在调用b()时,我们调整堆栈帧,并且鉴于两个函数之间的相似性(相同数量的参数,相同数量的局部变量等),内存位置b恰好是执行a时的位置。a()

这就是为什么它具有相同的价值。

请记住,这仅是由于您所拥有的特定场景,并且标准无法保证。您在b没有首先初始化它的情况下使用的那一刻,您可以保证获得一些任意值。

最重要的是,在尝试使用变量之前初始化变量。


推荐阅读