2010-01-11 45 views
0

我得到6,4,3分別爲前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 
+0

如果這是一個家庭作業問題(考慮到您的其他問題,這是顯而易見的),至少有一個標籤 – 2010-01-11 04:57:16

+0

以及您的答案/猜測是什麼? – 2010-01-11 04:58:11

+2

第一個問題是什麼? – Naveen 2010-01-11 05:01:19

回答

5

我不知道什麼是你的書的約定,但我相信,總有一款適合返回地址的地方,返回值和中間結果

一)返回地址,返回地址的地址結果,x,N,k,s,s + x [k]的中間結果=總數7

b)ret。 addr,ret結果的addr,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個位置來運行這個程序。

請注意,這個計算是基於我對你書籍習慣的猜測。

0

我的猜測是,在前三個賦值中的每一箇中缺少的一個位置是保存的幀指針,即指向當前棧位置之前的局部變量被分配。在函數退出時需要恢復幀指針,以便在函數返回之前返回地址確實位於棧頂。

最後一項任務的解決方案只是嵌套調用的分配記錄長度arl的總和的最大值。所以,在這個例子中

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

之和巴尼不會在同一時間調用,所以他們並不需要添加,因爲當一個巴尼分配和分配記錄已經被釋放。由於arl(main)爲7(返回地址,保存的幀指針,4個int的數組,int),第二個總和給出了更大的值16.但是,這比指定的答案少兩個。也許你的書給你指出了其他兩個位置應該是什麼。