块范围变量和激活记录
A block scoped variable and the 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
可能存在或可能不存在完全取决于用户在运行时的输入。在这种情况下,
- 变量
j
会被放入激活记录吗?
- 此实现是否已定义(换句话说,某些编译器是否会生成等同于
j
在 if` 块外部和上方声明的代码)?
- 或者,如果需要的话,
j
会在执行期间简单地分配在堆栈段上吗?但是,在那种情况下,j
将如何在 if
块之后超出范围?
我在 C11 规范中找不到太多关于此的信息。提前致谢。
激活记录也叫栈帧,如果我没记错的话。我相信这些就是答案:
Q1。变量j会不会被放入激活记录中?
A1:是的,除非被编译器优化。
Q2。此实现是否已定义(换句话说,某些编译器是否会生成等同于在 if 块外部和上方声明的 j 的代码)?
A2:它是实现定义的。取决于编译器和编译器的设置,但在大多数情况下,j 将在激活记录中。
Q3。或者,如果需要,是否会在执行期间将 j 简单地分配到堆栈段上?但是,在那种情况下,j 将如何在 if 块之后超出范围?
A3: 不,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...
}
查看此函数,似乎变量 j
可能存在或可能不存在完全取决于用户在运行时的输入。在这种情况下,
- 变量
j
会被放入激活记录吗? - 此实现是否已定义(换句话说,某些编译器是否会生成等同于
j
在 if` 块外部和上方声明的代码)? - 或者,如果需要的话,
j
会在执行期间简单地分配在堆栈段上吗?但是,在那种情况下,j
将如何在if
块之后超出范围?
我在 C11 规范中找不到太多关于此的信息。提前致谢。
激活记录也叫栈帧,如果我没记错的话。我相信这些就是答案:
Q1。变量j会不会被放入激活记录中?
A1:是的,除非被编译器优化。
Q2。此实现是否已定义(换句话说,某些编译器是否会生成等同于在 if 块外部和上方声明的 j 的代码)?
A2:它是实现定义的。取决于编译器和编译器的设置,但在大多数情况下,j 将在激活记录中。
Q3。或者,如果需要,是否会在执行期间将 j 简单地分配到堆栈段上?但是,在那种情况下,j 将如何在 if 块之后超出范围?
A3: 不,C 中的分配通常不依赖于局部变量的内容。