在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
答案 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。
很难相信这本书中的错误
不是真的,这本书有几页的勘误。阅读时,你必须在旁边有这个勘误表。