gpt4 book ai didi

c - 具有子作用域的函数的栈帧结构

转载 作者:太空狗 更新时间:2023-10-29 15:36:27 25 4
gpt4 key购买 nike

以下是代码,我将其作为引用,以了解函数中存在的子作用域(或)虚拟作用域(只是 {})如何影响堆栈框架的结构。

#include <stdio.h>
int main()
{
int main_scope=0; /*Scope and life time of the variable is throughout main*/

{
//From below two statements I assume that there
//is no seperate "stack frame" created for just
//braces {}.So we are free access (scope exists) and
//modify (lifetime exists) the variable "main_scope"
//anywhere within main

main_scope++;
printf("main_scope++:(%d)\n",main_scope);

//I expected this statement to throw an error saying
//"Multiple definition for "main_scope".But it isn't????

int main_scope=2;
printf("Value of redefined main_scope:(%d)\n",main_scope);

}

printf("Finally main_scope in %s:(%d)\n",__FUNCTION__,main_scope);
return 0;
}

示例输出

main_scope++:(1)
Value of redefined main_scope:(2)
Finally main_scope in main:(1)

基于上述行为,我推测如下。

  • 没有为范围 {} 创建堆栈框架。
  • 通过这种方式,在 main 和子范围 {} 中声明/定义的 auto 变量共享相同的堆栈帧。
  • 因此在 main 中声明/定义的变量可以在函数内的任何地方自由访问(甚至在子范围内)。
  • 另一方面,在子作用域中声明/定义的变量在 block 外失去其作用域。但只要堆栈帧存在,它的生命周期就有效。

问题:如果以上几点是正确的,那么为什么在给出同一变量的多个定义时代码不会失败,一个在 main 中,另一个在 main{}

最佳答案

硬件堆栈在这里无​​关紧要。它只能在函数入口处对所有局部变量增长一次,并且只能在函数退出时收缩一次,或者在每次定义新的局部变量时增长和收缩,并在保留封闭的 {} 时销毁它。

相关的是变量的“可见性”。

int main_scope=0;

{
main_scope++;
printf("main_scope++:(%d)\n",main_scope);
// the main_scope variable that was assigned 0 is the most recent
// visible declaration of main_scope.

int main_scope=2;
// now, the previous declaration of main_scope is obscured by the new one,
// and so, you're going to access the new one
printf("Value of redefined main_scope:(%d)\n",main_scope);
}

printf("Finally main_scope in %s:(%d)\n",__FUNCTION__,main_scope);
// the previous scope inside {} is left, so, main_scope is going to be
// the one, to which we assigned 0

在内部/子作用域中使用与外部/ super 作用域中相同的名称定义对象是完全合法的。后者将在 {} 范围的持续时间内被隐藏。

仅供引用,还有一些其他地方可以出现变量定义,例如在 for(;;) 的第一个表达式中声明:for (int i = 0; i < 10; i++) ... .那个变量 i只会在 for 的主体内可见,您也可以通过定义另一个 i 将其隐藏在那里.

关于c - 具有子作用域的函数的栈帧结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12873568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com