激活记录长度

时间:2010-01-11 04:53:02

标签: c activation-record

我分别得到前3个问题的6,4,3,但我不知道如何弄清楚最后一个问题。但是,解决方案手册显示了7,5,4,18作为答案。

int sum(int x[], int N) {
  int k = 0;
  int s = 0;
  while (k < N) {
    s = s + x[k];
    k = k + 1;
  }
  return s; // the activation record for sum will be ____________ locations
}

int fred(int a, int b) {
  return a + b;  // (2) the activation record for fred will be ____________ locations
}

void barney(int x) {
  x = fred(x, x);//(2) the activation record for barney will be ____________ locations
}

void main(void) {
  int a[4];
  int x = sum(a, 4);
  barney(x); 
} // (3) the stack must have at least _____________ locations to run this program

2 个答案:

答案 0 :(得分:5)

我不知道你的书的惯例是什么,但我认为,总有一个地方可以找到返回地址,返回值的地址和中间结果

a)返回地址,返回结果的地址,x,N,k,s,s + x的中间结果[k] =总计7

b)中保留。 addr,ret结果的addr,a,b,int。水库。 a + b =总计5

c)中保留。 addr,ret结果的addr,x,fred的返回结果的空间= total 4

d)最后一个不是在任何给定点询问激活记录最大所需堆栈大小。它调用sum,它调用barney和barney调用fred,即7 + 5 + 4 = 16.并且16 + a + x =总共18个位置来运行此程序。

请注意,此计算基于我对您的图书会议的猜测。

答案 1 :(得分:0)

我的猜测是前三个分配中每个分配中丢失的一个位置是保存的帧指针,即在分配局部变量之前指向当前堆栈位置的指针。在函数退出时需要恢复帧指针,以便在函数返回之前返回地址确实位于堆栈的顶部。

上一个任务的解决方案只是嵌套调用的分配记录长度 arl 总和的最大值。所以,在这个例子中

arl(program) = max(arl(main)+arl(sum), arl(main)+arl(barney)+arl(fred))

sum和barney不会同时被调用,因此不需要添加它们,因为当分配barney的分配记录时,已经释放了sum的分配记录。

因为arl(main)是7(返回地址,保存的帧指针,4个int的数组,int),所以第二个和给出16的更大值。但是,这比指示的答案少两个。也许你的书给你一个指示其他两个位置应该是什么。