堆溢出和栈溢出


堆溢出

堆用于存储动态变量。它是进程内存的一个区域。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]
}

更新于: 2019 年 7 月 30 日

6K+ 次浏览

开启你的 职业生涯

完成课程并获得认证

开始学习
广告