堆溢位和棧溢位
堆溢位
堆用於儲存動態變數。它是程序記憶體的一個區域。malloc()、calloc()、resize() 所有這些內建函式通常用於儲存動態變數。
當以下情況發生時,會發生堆溢位 -
A) 如果我們分配大量動態變數 -
int main() { float *ptr = (int *)malloc(sizeof(float)*1000000.0)); }
B) 如果我們不斷分配記憶體並在使用後不釋放記憶體。
int main() { for (int i=0; i<100000000000; i++) { int *p = (int *)malloc(sizeof(int)); } }
棧溢位
棧是一種後進先出資料結構。它用於儲存函式內部使用的區域性變數。引數透過此函式傳遞,並帶有其返回地址。
如果程式消耗了更多的記憶體空間,那麼棧溢位就會發生,因為棧的大小在計算機記憶體中是有限的。
當以下情況發生時,會發生棧溢位 -
C) 如果函式無限次地自身遞迴呼叫,那麼棧將無法儲存大量的區域性變數,因此將會發生棧溢位 -
void calculate(int a) { if (a== 0) return; a = 6; calculate(a); } int main() { int a = 5; calculate(a); }
D) 如果我們宣告大量的區域性變數或宣告一個大型維度陣列或矩陣,可能導致棧溢位。
int main() { A[20000][20000] }
廣告