堆疊溢位一般是什麼原因?
堆疊是一個在電腦科學中經常使用的抽象資料型別。堆疊中的物體具有一個特性: 最後一個放入堆疊中的物體總是被最先拿出來, 這個特性通常稱為後進先出(LIFO)佇列。 堆疊中定義了一些操作。 兩個最重要的是PUSH和POP。 PUSH操作在堆疊的頂部加入一 個元素。POP操作相反, 在堆疊頂部移去一個元素, 並將堆疊的大小減一。
堆疊溢位的產生是由於過多的函式呼叫,導致呼叫堆疊無法容納這些呼叫的返回地址,一般在遞迴中產生。堆疊溢位很可能由無限遞迴(Infinite recursion)產生,但也可能僅僅是過多的堆疊層級。

堆溢位:不斷的new 一個物件,一直建立新的物件,
棧溢位:死迴圈或者是遞迴太深,遞迴的原因,可能太大,也可能沒有終止。
通常「堆疊溢位」是指「呼叫堆疊(call stack)的溢位」。要通俗地解釋呼叫堆疊可能比較困難,因為它涉及許多其他計算機架構的知識。而這個答案只是簡單地解釋堆疊這種資料結構的特點──先進後出/後進先出。溢位是指這個資料結構滿溢,不能存放更多資料。其他的資料結構也會遇到這個情況。即使資料結構並非固定容量,而是可擴充套件的,在有限的記憶體空間下仍是有滿溢的機會。
另外,很多時候,「呼叫堆疊溢位」的出現是與遞迴(recursion)相關的。我們可以把一些遞迴的實現改為迭代(iteration),但有時還是必須有一個自定義的堆疊資料結構,例如對樹的深度優先搜尋(Depth-First Search, DFS)。自定義的堆疊也是有溢位的可能。
所以,雖然堆疊溢位常指呼叫堆疊溢位,但本質上也只是一種資料結構的滿溢情況。