前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发布于 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个位置来运行这个程序。
请注意,此计算是基于我对您的书籍约定的胡乱猜测。
发布于 2010-01-16 06:29:41
我的猜测是,在前三个赋值中缺少的一个位置是保存的帧指针,即在分配局部变量之前指向当前堆栈位置的指针。需要在函数退出时恢复帧指针,以便在函数返回之前,返回地址确实位于堆栈的顶部。
最后一个任务的解决方案是嵌套调用的分配记录长度arl之和的最大值。所以,在这个例子中
arl(program) = max(arl(main)+arl(sum), arl(main)+arl(barney)+arl(fred))sum和barney不是同时调用的,所以不需要添加它们,因为在分配barney的分配记录时,sum的分配记录已经释放。
由于arl(main)是7(返回地址,保存的帧指针,4个整数组成的数组,整数),第二个和给出了更大的值16。然而,这比你的书给出的指示其他两个位置的answer.Maybe少了两个。
https://stackoverflow.com/questions/2039979
复制相似问题