2017-01-27 9 views
-2

を積み重ね、CalcのプログラムのスタックはそうなバグがK & R帳では例

#define MAXVAL 100 
int sp =0;   /* next free stack position */ 
double val[MAXVAL]; /* value stack*/ 
/* push: push f onto value stack */ 
void push(double f) { 
    if (sp < MAXVAL) 
     val[sp++] = f; 
    else 
     printf ("error: stack full, can't push%g\n",f); 
} 

を持っていることは、スタックオーバーフローを引き起こして1つの余分な値をプッシュすることができます。それは(sp < MAXVAL - 1)にする必要があります。 しかし、この本のような間違いを信じるのは難しいです。

+0

'sp ++'ではなく '++ sp'です! –

+4

接頭辞と後置増分の違いを知っていますか? – eduffy

+0

'sp'が' 99'(つまり '* MAXVAL - 1'と等しく、' MAXVAL'よりも小さい)であるときには、それはまだ配列への有効なインデックスです。 –

答えて

6

これは間違いではありません。 0からMAXVAL-1(含む)のインデックスにval[]を割り当てることは合法です。 sp++sp後、その値がインデックスval[]のために使用されているインクリメントされていることを意味し、ポストインクリメント表現であることを

注意。したがって、この例では未定義の動作はありません。

+0

おかげさまで、sp == 99の場合、次の自由な位置になります。完全なsp is100で。 – rx6147

+0

@RahulSharmaはい、そうです。 – dasblinkenlight

0

spのみ0から99まで、またはそうでなければval[sp++] = f;を実行し得ることはありません値を有することができ、1つの余分な値をプッシュすることができます。ポストインクリメント++演算子がどのように動作するかを調べる必要があると私は思っています。スタックオーバーフローに

番号を引き起こし

本の文言は、おそらくあなたを混乱さ。 double val[MAXVAL];はスタックには割り当てられませんが、グローバルRAMセグメント(通常は.bss)に割り当てられます。この配列は、本の「バリュースタック」と呼ばれています。それはあなたのコンピュータのスタックセグメントではなく、スタックADTです。

はそうでもない、本は数ページの正誤表を持って、この本の中で、このような間違いを信じるのは難しいです。読んでいるときには、この正誤表が隣になければなりません。

関連する問題