块范围变量和激活记录

时间:2017-12-13 15:32:08

标签: c activation-record

我理解局部变量(以及其他内容)都放在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...
}

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

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

1 个答案:

答案 0 :(得分:0)

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

Q1。变量j是否会被置于激活记录中?

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

Q2。是否已定义此实现(换句话说,某些编译器是否会生成等效于j在if`块之外和之上声明的代码)?

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

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

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