在本文中,我们将解释访问链接和控制链接。嗯,两者都在激活记录领域。
激活记录 :
活动记录是一个连续的存储块,用于管理单个过程执行所需的信息。当您进入一个过程时,您分配一个激活记录,当您退出该过程时,您将取消分配它。基本上,它存储当前激活函数的状态。因此,无论何时发生函数调用,都会创建一个新的活动记录并将其压入堆栈顶部。这将是在函数上,直到该函数的执行。因此,一旦该过程完成并返回到调用函数,该激活函数就会从堆栈中弹出。
如果一个过程被调用,一个活动记录被压入堆栈,并在控制返回到调用函数时弹出。
激活记录包括一些字段,它们是——
返回值、参数列表、控制链接、访问链接、保存的机器状态、本地数据和临时数据。
访问链接:
它指的是存储在其他非本地的激活记录中的信息。访问链接是一个静态链接,访问链接的主要目的是访问活动记录的本地范围内不存在的数据。它是一个静态链接。
让我们举个例子来理解这一点——
C
#include
int g=12;
void Geeks()
{
printf("%d", g);
}
void main()
{
Geeks();
}
C
#include
int main (int argc, char *argv[]) {
int a = 100;
int geeks(int b) {
int c = a+b;
return c;
}
int geek1(int b) {
return geeks(2*b);
}
(void) printf("The answer is %d\n", geek1(a));
return 0;
}
C
#include
int geeks(int x)
{
printf("value of x is: %d", x);
}
int main()
{
geeks(10);
}
C
#include
int geeks();
int main() {
int x, y;
//Calling a function
geeks();
return 0;
}
int geeks() {
//Function called from main()
printf("Function called from main()");
return 0;
}
现在,在这个例子中,当在 main() 中调用 Geeks() 时,在 main() 中 Geeks() 的任务是打印 (g),但 g 并未在其范围内定义(Geeks() 的本地范围) );在这种情况下,Geeks() 将使用访问链接从全局范围访问“g”,然后打印其值 (g=12)。
作为访问链接链(想想作用域),程序跟踪其静态结构。
现在,让我们再举一个例子来详细了解访问链接的概念——
C
#include
int main (int argc, char *argv[]) {
int a = 100;
int geeks(int b) {
int c = a+b;
return c;
}
int geek1(int b) {
return geeks(2*b);
}
(void) printf("The answer is %d\n", geek1(a));
return 0;
}
编译程序时没有检测到错误,显示正确答案是300。现在,让我们讨论嵌套路径。嵌套过程包括一个 AR(激活记录)访问链接,使用户能够访问其直接外部过程所采取的最新操作的 AR。因此,在此示例中,geeks 的访问链接和 geeks1 的访问链接将分别指向主激活的 AR。
每个活动记录都有一个称为访问链接的指针,它有助于直接实现正常的静态范围规则。
控制链接:
在这种情况下,它指的是调用者的激活记录。它们通常用于链接和保存状态。它本质上是一个动态链接。当一个函数调用另一个函数,则控制链接指向调用者的激活记录。
记录 A 包含指向堆栈上前一条记录的控制链接。动态执行的程序由控制链接链跟踪。
例子 –
C
#include
int geeks(int x)
{
printf("value of x is: %d", x);
}
int main()
{
geeks(10);
}
我们再举一个例子——
C
#include
int geeks();
int main() {
int x, y;
//Calling a function
geeks();
return 0;
}
int geeks() {
//Function called from main()
printf("Function called from main()");
return 0;
}
当函数geeks() 被调用时,它使用访问链接方法在其调用函数main() 中访问 x 和 y(静态作用域)。