簡體   English   中英

K&R 堆棧示例中的可能錯誤

[英]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)。 但是很難相信這本書中有這樣的錯誤。

這不是錯誤。 在從0MAXVAL-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM