[英]likely bug in K&R stack example
在 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 < MAXVAL - 1)。 但是很難相信這本書中有這樣的錯誤。
這不是錯誤。 在從0
到MAXVAL-1
索引MAXVAL-1
val[]
是合法的。
請注意, sp++
是一個后增量表達式,這意味着sp
在其值用於索引val[]
后遞增。 因此,在這個例子中沒有未定義的行為。
它可以推送 1 個額外的值
不能。 sp
只能有 0 到 99 之間的值,否則val[sp++] = f;
不會被執行。 我懷疑您需要研究后增量 ++ 運算符的工作原理。
導致堆棧溢出
不。書中的措辭可能讓您感到困惑。 double val[MAXVAL];
不在堆棧上分配,而是在全局 RAM 段(通常稱為.bss
)中分配。 這個數組在書中被稱為“值堆棧”。 它不是您計算機的堆棧段,而是堆棧 ADT。
很難相信這本書中有這樣的錯誤
不是真的,這本書有幾頁的勘誤表。 閱讀時,您必須隨身攜帶此勘誤表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.