variables - 为什么一个子程序的变量正在访问另一个子程序的值?
问题描述
为什么要为变量 '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;
}
解决方案
这是因为您没有b
在第二个函数中进行初始化,这意味着它将具有一些任意值。在这种情况下,它获得的值似乎是a
前一个函数的值。
当您调用一个函数时,它会调整堆栈指针,使其具有与调用者分开的堆栈帧main()
。调用会这样做a()
,然后它将a
在其堆栈帧中设置一些内存位置(用于局部变量)为743
.
然后当我们退出 a()
时,我们调整堆栈指针,以便我们再次使用堆栈帧,main()
但我们不会清除堆栈帧所在的内存a()
。
然后,在调用b()
时,我们调整堆栈帧,并且鉴于两个函数之间的相似性(相同数量的参数,相同数量的局部变量等),内存位置b
恰好是执行a
时的位置。a()
这就是为什么它具有相同的价值。
请记住,这仅是由于您所拥有的特定场景,并且标准无法保证。您在b
没有首先初始化它的情况下使用的那一刻,您可以保证获得一些任意值。
最重要的是,在尝试使用变量之前初始化变量。
推荐阅读
- python - 从 .txt 文件中读取并显示它
- laravel - 我无法在 laravel 中执行 MyCommand
- java - 使用 Spring Boot JPA 配置多个数据源
- android - 清单中的路径命名法
- google-cloud-platform - 跨多个区域的持久磁盘冗余
- angular - 在 Angular 中提交后的 Toast 通知(成功或失败)
- r - as.raw 和其他 as.* 函数在应用于数组时会删除维度属性
- java - 有什么方法可以使编程确定的默认语言?
- python - 如何在sklearn中获得预测区间而不是点估计以进行回归
- html - 如何使div右上角裁剪