C中的堆溢出和堆栈溢出
堆溢出
堆用于存储动态变量。它是进程内存的区域。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] }