卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章19305本站已运行343

在C语言中,堆溢出(Heap overflow)和栈溢出(Stack overflow)是指程序在使用堆内存或栈内存时超出了其分配的边界

在C语言中,堆溢出(Heap overflow)和栈溢出(Stack overflow)是指程序在使用堆内存或栈内存时超出了其分配的边界

堆溢出

堆用于存储动态变量。它是进程内存的一个区域。 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]
}
上一篇: 如何在 PHP 中设计和开发一个灵活的商场优惠券模块
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏