块作用域变量和激活记录

bab*_*bon 5 c activation-record

我知道,局部变量(以及其他内容)被放置在激活记录中。并且在函数开始执行之前,激活记录必须存在。考虑以下功能:

void f(void)
{
    int i;
    scanf("%d", &i);
    if (i > 10) {
        int j = 22;
        // do some operations on j here.
    }
    // more code below...
}
Run Code Online (Sandbox Code Playgroud)

查看此函数,似乎该变量j可能存在或可能不存在,完全取决于运行时用户的输入。在这种情况下,

  1. 变量j将被放置在激活记录中吗?
  2. 是否定义了此实现(换句话说,某些编译器会生成等同于j在if`块之外和之上声明的代码)吗?
  3. 或者,j如果需要,将在执行期间将其简单地分配到堆栈段上吗?但是,在这种情况下,如何jif块之后超出范围?

我在C11规范中找不到关于此的太多信息。提前致谢。

Vla*_*adP 0

如果我没记错的话,激活记录也称为堆栈帧。我相信这些就是答案:

Q1. 变量j会被放入激活记录中吗?

A1:是的,除非被编译器优化掉。

Q2。这个实现是否已定义(换句话说,某些编译器是否会生成相当于在 if` 块外部和上方声明 j 的代码)?

A2:它是实现定义的。取决于编译器和编译器的设置,但在大多数情况下,j将在激活记录中。

Q3。或者,如果需要的话,j会在执行期间简单地分配在堆栈段上吗?但是,在这种情况下,j 在 if 块之后如何超出范围呢?

A3:不,C 中的分配通常不依赖于局部变量的内容。