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]=合計7の中間結果

b)ret。addr、ret結果のaddr、a、b、int。解像度 a +b=合計5

c)ret。addr、ret結果のaddr、x、fredの戻り結果のためのスペース=合計4

d)最後の1つは、任意の時点でアクティブ化レコードに必要な最大スタックサイズを要求していません。それはsumを呼び出し、barneyを呼び出し、barneyは7 + 5 + 4=16であるfredを呼び出します。そして16+a +x=このプログラムを実行するための合計18の場所。

この計算は、あなたの本の慣習についての私の野蛮な推測に基づいていることに注意してください。

于 2010-01-14T06:29:00.583 に答える
0

私の推測では、最初の3つの割り当てのそれぞれで欠落している1つの場所は、保存されたフレームポインター、つまりローカル変数が割り当てられる前の現在のスタック場所へのポインターです。関数が戻る前に戻りアドレスが実際にスタックの最上位になるように、関数の終了時にフレームポインタを復元する必要があります。

最後のタスクの解決策は、ネストされた呼び出しの割り当てレコード長arlの合計の最大値です。したがって、この例では

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

sumとbarneyは同時に呼び出されないため、追加する必要はありません。これは、barneyの割り当てレコードが割り当てられたときに、sumの割り当てレコードがすでに解放されているためです。

arl(main)は7(差出人住所、保存されたフレームポインター、4 intの配列、int)であるため、2番目の合計は16の大きい値になります。ただし、これは示された答えより2つ少なくなります。他の2つの場所がどうあるべきかを示します。

于 2010-01-15T22:29:41.250 に答える