Desbordamiento de pila y desbordamiento de pila

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:

  1. 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));
        }
    }
  2. 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:

  1. 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];
    }
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *