怎样通俗地解释「堆栈溢出」是什么?

关注者
356
被浏览
106,757

40 个回答

老公洗一堆盤子,洗完一個就疊在旁邊。

桌面比較小,只能一個個疊在一起。

然後老婆會幫忙把盤子一個個從上到下取出,安放在廚櫃裡。

如果老婆手腳太慢,那麼可能疊得太高,老公沒空間放盤子了,那麼就得停下來沒法洗了。

盤子 = 數據

疊起來的空間 = 堆栈

盤子沒位置放 = 堆栈溢出

==============================

2014/8/2 更新一下概念問題。

通常「堆棧溢出」是指「調用堆棧(call stack)的溢出」。要通俗地解釋調用堆棧可能比較困難,因為它涉及許多其他計算機架構的知識。而這個答案只是簡單地解釋堆棧這種數據結構的特點──先進後出/後進先出。溢出是指這個數據結構滿溢,不能存放更多數據。其他的數據結構也會遇到這個情況。即使數據結構並非固定容量,而是可擴展的,在有限的內存空間下仍是有滿溢的機會。

另外,很多時候,「調用堆棧溢出」的出現是與遞歸(recursion)相關的。我們可以把一些遞歸的實現改為迭代(iteration),但有時還是必須有一個自定義的堆棧數據結構,例如對樹的深度優先搜索(Depth-First Search, DFS)。自定義的堆棧也是有溢出的可能。

所以,雖然堆棧溢出常指調用堆棧溢出,但我認為本質上也只是一種數據結構的滿溢情況。對於缺乏計算機知識的對象,可能可以先解釋堆棧這種數據結構,有機會才更深入解釋如何用這種數據結構實現函數調用及函數內的局部存儲。

看图最明显,这个地址空间已经不能位置存放新的东西了,再放,东西就要放不下了。