堆溢位和棧溢位


堆溢位

堆用於儲存動態變數。它是程序記憶體中的一個區域。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));
   }
}

棧溢位

棧是一種後進先出的資料結構。它用於儲存函式中使用的區域性變數。引數透過此函式傳遞,以及其返回地址。

如果程式消耗的記憶體空間過多,則會發生棧溢位,因為計算機記憶體中的棧大小受到限制。

棧溢位發生在下列情況時

A) 如果一個函式自行遞迴呼叫無限次,則棧將無法儲存大量區域性變數,因此會發生棧溢位。

void calculate(int a) {
   if (a== 0)
      return;
      a = 6;
      calculate(a);
}
int main() {
   int a = 5;
   calculate(a);
}

B) 如果我們宣告大量區域性變數或宣告大型維度陣列或矩陣,可能導致棧溢位。

int main() {
   A[20000][20000];
}

更新於:2019 年 7 月 30 日

506 次瀏覽

職業生涯起航

完成課程,獲得認證

開始學習
廣告
© . All rights reserved.