c++ - 即使在函数调用在 C/C++ 中结束后,函数内部声明的变量是否仍保留在堆栈中?
问题描述
下面是我的 C++ 代码。这里在函数“temp”中,首先声明“ch”的值然后打印(第一次“ch”没有初始化,所以“ch”有未定义的值)。然后“if”条件满足(在里面“如果”没有工作完成)。然后函数结束并返回到函数调用的下一行(增量'i')。然后下一次迭代也以与上一次调用相同的方式进行。相同的循环一直持续到按键被按下。当一个键被按下时(例如“a”被按下),“else”被执行并且被按下的键被 getch() 获取。然后函数结束并返回到函数调用的下一行(i++),然后在所有即将到来的下一次迭代中,当调用一个函数时,'ch'被分配与前一个键按下('a' )并打印该字符('a')。它继续打印'a',直到按下另一个键。为什么以及如何为“ch”分配上一个函数调用的值。上一次调用的变量值是否存储在堆栈中并将其分配给下一次调用的变量?
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
int flag = 0,i = 1;
void temp()
{
char ch;
cout<<ch;
if(!_kbhit())
{
}
else{
ch=_getch();
}
}
int main()
{
while(flag!=1)
{
temp();
i++;
}
return 0;
}
解决方案
在您的代码中(以及在英特尔上),在调用temp()
并返回之后,没有代码可以修改ch
堆栈上的位置。因此,当您再次调用它时,它仍然具有先前的值。
例如,您是否会在调用printf()
后main()
调用temp()
,然后此调用将覆盖 的位置ch
。
推荐阅读
- javascript - 如何在 jQuery 中使用 while 循环
- python - tensorflow lite 推理返回所有 nan
- php - Laravel 抛出错误“方案 `javascript` 无效。它应该是 `http` 或 `https`”
- amazon-web-services - Postgres 容器部署到 EBS 但在 ssh 进入 EC2 时未运行
- r - R:绘制具有两个条件的个人百分比条形图
- python - 如何从数据框中随机选取行,直到它们变为特定值,然后显示拾取的行?
- angular - 为什么我在生产中使用 aot 构建失败?
- gradle - Gradle 如何解析 Gradle 插件门户中未列出的插件?
- php - 如何在查询生成器中有效地转换嵌套 SQL
- python - 如何将一个子进程的输出传递给另一个子进程的输入?