Desbordamiento de montón:
Heap es una región de la memoria del proceso que se utiliza para almacenar variables dinámicas. Estas variables se asignan usando las funciones malloc() y calloc() y se redimensionan usando la función realloc(), que son funciones incorporadas de C. Se puede acceder a estas variables globalmente y una vez que asignamos memoria en el montón, es nuestra responsabilidad liberar ese espacio de memoria después de su uso. Hay dos situaciones que pueden provocar un desbordamiento del montón:
- Si asignamos memoria continuamente y no liberamos ese espacio de memoria después de su uso, puede provocar una fuga de memoria: la memoria todavía se está utilizando pero no está disponible para otros procesos.
// C program to demonstrate heap overflow
// by continuously allocating memory
#include<stdio.h>
int
main()
{
for
(
int
i=0; i<10000000; i++)
{
// Allocating memory without freeing it
int
*ptr = (
int
*)
malloc
(
sizeof
(
int
));
}
}
- Si asignamos dinámicamente una gran cantidad de variables.
// C program to demonstrate heap overflow
// by allocating large memory
#include<stdio.h>
int
main()
{
int
*ptr = (
int
*)
malloc
(
sizeof
(
int
)*10000000));
}
Desbordamiento de pila:
Stack es una región especial de la memoria de nuestro proceso que se utiliza para almacenar variables locales utilizadas dentro de la función, parámetros pasados a través de una función y sus direcciones de retorno. Cada vez que se declara una nueva variable local, se coloca en la pila. Todas las variables asociadas con una función se eliminan y la memoria que usan se libera una vez que la función termina de ejecutarse. El usuario no tiene necesidad de liberar espacio de pila manualmente. Stack es la estructura de datos Last-In-First-Out.
En la memoria de nuestra computadora, el tamaño de la pila es limitado. Si un programa utiliza más espacio de memoria que el tamaño de la pila, se producirá un desbordamiento de la pila y puede provocar un bloqueo del programa. Hay dos casos en los que puede ocurrir un desbordamiento de pila:
- Si declaramos una gran cantidad de variables locales o declaramos una array o array o cualquier array de mayor dimensión de gran tamaño, puede resultar en un desbordamiento de la pila.
// C program to demonstrate stack overflow
// by allocating a large local memory
#include<stdio.h>
int
main() {
// Creating a matrix of size 10^5 x 10^5
// which may result in stack overflow.
int
mat[100000][100000];
}
- Si la función se llama recursivamente a sí misma infinitas veces, la pila no puede almacenar una gran cantidad de variables locales utilizadas por cada llamada de función y dará como resultado un desbordamiento de la pila.
// C program to demonstrate stack overflow
// by creating a non-terminating recursive
// function.
#include<stdio.h>
void
fun(
int
x)
{
if
(x == 1)
return
;
x = 6;
fun(x);
}
int
main()
{
int
x = 5;
fun(x);
}
Consulte Diseño de memoria de programas C para obtener más detalles.
Publicación traducida automáticamente
Artículo escrito por shivani.mittal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA