我理解局部变量(以及其他内容)都放在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规范中找不到关于此的更多信息。提前谢谢。
答案 0 :(得分:0)
激活记录也称为堆栈帧,如果我没有记错的话。我相信这些是答案:
Q1。变量j是否会被置于激活记录中?
A1:是的,除非编译器优化。
Q2。是否已定义此实现(换句话说,某些编译器是否会生成等效于j在if`块之外和之上声明的代码)?
A2:它是实现定义的。取决于编译器的编译器和设置,但在大多数情况下,j将处于激活记录中。
Q3。或者,如果需要,将在执行期间将j简单地分配在堆栈段上吗?但是,在那种情况下,如果j块在if块之后将如何超出范围?
A3:不,C中的分配通常不依赖于局部变量的内容。