可能是K& R堆栈示例中的错误

时间:2017-01-27 11:08:12

标签: c

在K& R书中,Calc程序的堆栈已经

#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

2 个答案:

答案 0 :(得分:6)

这不是一个错误。从val[]0的索引分配MAXVAL-1是合法的。

请注意,sp++是一个后增量表达式,这意味着{/ 1}在其值已用于索引{{>>后递增 1}}。因此,此示例中没有未定义的行为。

答案 1 :(得分:0)

  

它可以推送1个额外值

没有。 sp只能包含0到99之间的值,否则val[sp++] = f;将无法执行。我怀疑你需要研究后增量++运算符的工作原理。

  

导致堆栈溢出

没有。书中的措辞可能让你感到困惑。 double val[MAXVAL];未在堆栈上分配,而是在全局RAM段(通常称为.bss)中分配。这个数组被称为&#34;值堆栈&#34;靠书。它不是您计算机的堆栈段,而是堆栈ADT。

  

很难相信这本书中的错误

不是真的,这本书有几页的勘误。阅读时,你必须在旁边有这个勘误表。