📜  访问链接和控制链接

📅  最后修改于: 2021-09-28 10:54:28             🧑  作者: Mango

在本文中,我们将解释访问链接和控制链接。嗯,两者都在激活记录领域。

激活记录
活动记录是一个连续的存储块,用于管理单个过程执行所需的信息。当您进入一个过程时,您分配一个激活记录,当您退出该过程时,您将取消分配它。基本上,它存储当前激活函数的状态。因此,无论何时发生函数调用,都会创建一个新的活动记录并将其压入堆栈顶部。这将是在函数上,直到该函数的执行。因此,一旦该过程完成并返回到调用函数,该激活函数就会从堆栈中弹出。
如果一个过程被调用,一个活动记录被压入堆栈,并在控制返回到调用函数时弹出。

激活记录包括一些字段,它们是——
返回值、参数列表、控制链接、访问链接、保存的机器状态、本地数据和临时数据。

激活记录

访问链接:
它指的是存储在其他非本地的激活记录中的信息。访问链接是一个静态链接,访问链接的主要目的是访问活动记录的本地范围内不存在的数据。它是一个静态链接。
让我们举个例子来理解这一点——

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(静态作用域)。