首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >激活记录长度

激活记录长度
EN

Stack Overflow用户
提问于 2010-01-11 12:53:02
回答 2查看 1.9K关注 0票数 0

前3道题我分别得了6、4、3分,但我不知道最后一道题怎么算。然而,解决方案手册指出了7、5、4、18作为答案。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-14 14:29:01

我不知道你的书的惯例是什么,但我假设,总会有一个地方来存放返回地址、返回值的地址和中间结果

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

b)ret.addr,ret结果的地址,a,b,int。资源。a+b =总计5

c)ret。addr,ret结果的addr,x,fred返回结果的空格= total 4

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

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

票数 5
EN

Stack Overflow用户

发布于 2010-01-16 06:29:41

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

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

代码语言:javascript
复制
arl(program) = max(arl(main)+arl(sum), arl(main)+arl(barney)+arl(fred))

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

由于arl(main)是7(返回地址,保存的帧指针,4个整数组成的数组,整数),第二个和给出了更大的值16。然而,这比你的书给出的指示其他两个位置的answer.Maybe少了两个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2039979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档