c - 堆栈结构如何与函数内的复合语句一起使用?
问题描述
我正在尝试学习 c 编程,但无法理解堆栈是如何工作的。
在我阅读的所有地方,我发现当调用函数时,会在堆栈中创建堆栈帧,其中包含函数调用参数、返回地址和局部变量的所有数据。当函数返回时,堆栈帧被删除释放内存。
但是,如果我们在函数内部有一个复合语句,它有自己的变量呢?块的局部变量的内存也是在函数调用时在栈帧内分配,返回时释放。
例子
int main(){
int a = 10;
if(int a<50){
int b=9;
}
else{
int c=10;
}
}
函数开始执行时是否为b和c分配了内存?并在函数返回时释放?
如果是这样,那么除了在函数开头或函数的另一个块内声明变量时变量的可见性之外没有其他区别。
请解释。
解决方案
C 标准没有指定如何实现这些东西。C 标准甚至没有提到堆栈!堆栈是实现函数调用的常用方式,但标准中没有任何内容需要堆栈。所有这些都是实现特定的细节。对于发布的代码,标准仅指定变量何时在范围内。
因此,您的问题没有一般性的答案。答案取决于您的特定系统,即处理器、编译器等。
如果您的系统使用堆栈(很可能),编译器可能会为所有 3 个变量保留堆栈空间,或者它可能为 2 个变量保留空间,即一个用于a
whileb
并c
共享另一个。两种实现都是合法的。编译器甚至可以将变量直接放在一些寄存器中,这样就不需要在堆栈上保留任何东西。
您可以通过查看生成的汇编代码来检查您的特定系统。
推荐阅读
- r - 使用传播 {tidyr} 函数,得到“地图错误(.variables,id_var,drop = drop):找不到对象'map_impl'”
- vue.js - Vue:如何使用库中的指令
- javascript - 仅使 div 的折叠部分可点击 - 展开部分应保持不可点击
- json - 如何制作一个反应表,其行和列来自 JSON 对象
- windows - ngrok 从 Windows 7 命令行杀死隧道
- python - 如何在 Python networkx 中的节点名称旁边添加节点属性?
- java - 我的代码中的 Java 错误线程“AWT-EventQueue-0”中的异常
- java - Mysql土耳其语字符编码
- http - HTTP 502 "Bad Gateway" / writev() 失败(104:连接被对等方重置)
- go - 在空通道上测距时抢先退出的可执行文件