0

前 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
4

2 回答 2

5

我不知道你的书的约定是什么,但我假设,总是有返回地址、返回值地址和中间结果的地方

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

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

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

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

请注意,此计算是基于我对您的书籍约定的疯狂猜测。

于 2010-01-14T06:29:00.583 回答
0

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

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

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

sum 和 barney 不是同时调用的,所以不需要添加,因为 sum 的分配记录在分配 barney 的时候已经释放了。

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

于 2010-01-15T22:29:41.250 回答