Lenguaje de programación c
La asignación de memoria dinámica es uno de los conceptos principales e importantes en "C" y también, uno de los temas de pellizco para el punto de entrevistas. Malloc, Calloc, Free y Realloc están incluidos en los archivos de encabezado "STDLIB.H" en "C" y son básicamente las funciones utilizadas en la implementación de la asignación de memoria dinámica.
En este artículo, nos centraremos en estas funciones e intentaremos entender cómo usar estas funciones de manera eficiente. Entonces, vamos a sumergirnos en el tema.

¿Qué Es La Asignación De Memoria Dinámica?

El proceso de asignación de memoria en tiempo de ejecución se conoce como asignación de memoria dinámica. ¿Qué significa esto "en tiempo de ejecución" ?  En general, cuando declaramos una variable primitiva suponga “int a;”   entonces la memoria se asigna en el momento de la compilación y lo llamamos “ memoria estática” de la asignación. Por estática, queremos decir que la memoria que se ha asignado tiene un tamaño realmente fijo.
Si hablamos de la matriz, entonces el tamaño declarado también se corrige por lo que incluso se incluye en la asignación de memoria estática. Además, el tipo de datos definido por el usuario, por ejemplo, el tamaño de la estructura también se corrige cuando codificamos nuestro programa.
Este tipo de declaración tiene un tamaño fijo inicialmente algo que no es preferible y no queremos un programa codificado de forma rígida todas las veces. Necesitamos algo que debe ser dinámico y de acuerdo con los requisitos, la asignación de memoria debe hacerse.
Puede haber varios escenarios cuando necesitamos memoria adicional o la memoria del programa no se especifica de antemano, por lo que se asigna dinámicamente según la necesidad del programa. Por ejemplo, en el caso de una matriz, el tamaño se puede aumentar o disminuir en función de los elementos que estamos almacenando y eliminando.

¿Cómo Logramos La Asignación De Memoria Dinámica?

En el caso de una asignación dinámica, las rutinas de biblioteca conocidas como  funciones de administración de memoria  se utilizan para asignar y liberar memoria durante la ejecución de un programa. Estas funciones se definen en el archivo de cabecera "stdlib.h" Esto proporciona las funciones necesarias para asignar y desasignar la memoria que discutiremos más adelante en esta publicación.
Para comprender mejor la asignación de memoria dinámica, primero concentrémonos en cómo se distribuye la memoria entre varios parámetros en un programa "C". Observe la siguiente tabla.
En general, las variables globales, variables estáticas e instrucciones de programas se almacenan en el área de almacenamiento permanente. Mientras que, las variables locales se almacenan en un área de memoria llamada  Pila.
La memoria entre la variable local y global se llama como  área de almacenamiento  dinámico . Es básicamente una estructura de datos utilizada para la asignación de memoria dinámica durante la ejecución de nuestro programa. El tamaño del montón sigue cambiando según los requisitos de memoria.

Funciones Utilizadas Al Implementar La Asignación De Memoria Dinámica

  1. Función Malloc ()
Esta función se utiliza para asignar memoria a arreglos o  estructuras", pero para el bloque único de memoria solicitada. Básicamente, este método se utiliza para asignar la memoria para los tipos de datos definidos por el usuario en lenguaje C. Esta función reserva un bloque de memoria de tamaño específico y devuelve un  puntero  de tipo "vacío" que se puede convertir en un puntero de cualquier forma. ¿Qué entendemos por esta línea? Asi que,
En la asignación dinámica, los punteros juegan un papel clave. La función toma un argumento, es decir, el tamaño en el que la cantidad de bytes que queremos asignar y luego el tipo de retorno es un "puntero de vacío" que es un tipo genérico" y, según nuestra conveniencia, podemos escribirlo en lo que queramos, es decir, podría ser de tipo fundido en un entero, char, double, float, struct, lista enlazada, nodo gráfico o cualquier otra cosa. 
Una vez que la memoria se asigna correctamente, devuelve la dirección base de la memoria que retienen nuestros punteros devueltos y si falla, devuelve el "puntero nulo".
SYNTAX:- void* malloc(byte-size);
Cuando se ejecuta la función malloc, según el compilador y el sistema operativo de 16 o 32 bits, asigna la memoria para los tipos de datos.
Programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
int number, i, *pointer, sum = 0;
printf
("Enter number of elements: ");
scanf
("%d", &number);

// memory allocation using the malloc function
pointer
= (int*) malloc(number * sizeof(int));
// here (int*) is actually typecasted from void pointer
// to integer pointer since our function accept the integer type.

if(pointer == NULL)
{
printf
("Memory not allocated.");
exit(0);
}
printf
("Enter elements of array: ");
for(i = 0; i < number; ++i)
{
scanf
("%d", pointer + i);
sum
+= *(pointer + i);
}
printf
("Sum = %d", sum);
free
(pointer);
getch();
}
2. Función Calloac ()
Este método también se utiliza para asignar memoria a matrices y estructuras. Al igual que malloc, si no puede asignar suficiente espacio como se especifica, devuelve un puntero nulo. La mayor diferencia entre malloc () y calloac () es que maneja las múltiples solicitudes de asignación de memoria.
SYNTAX: - (void *) calloc (number_of_items, element_size);
La función toma dos argumentos, uno es el tamaño de la matriz o diga el tipo de datos y el otro es el tamaño de cada elemento y el tipo de retorno es de nuevo un puntero nulo que es un tipo genérico. Si hay suficiente memoria disponible, la función calloac asigna un bloque de memoria de tamaño " número de elementos * tamaño de elementos" y devuelve la dirección base almacenada en el puntero del vacío.
Programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void main()
{
int number, i, *ptr, sum = 0;
printf
("Enter number of elements: ");
scanf
("%d", &number);
// implementing the calloc function
ptr
= (int*) calloc(number, sizeof(int));
if(ptr == NULL)
{
printf
("Error! memory not allocated.");
exit(0);
}

printf
("Enter elements of array: ");
for(i = 0; i < number; ++i)
{
scanf
("%d", ptr + i);
sum
+= *(ptr + i);
}

printf
("Sum = %d", sumber);
free
(ptr);
getch();
}
Nota: - Si el primer argumento de la función calloc () es nulo, entonces
Es equivalente a la función malloc ().
3. Función Realloc ()
El lema básico de este método es aumentar o disminuir el tamaño de una matriz o, por ejemplo, reasignar la memoria que ha sido asignada por las funciones malloc () y calloc () si la memoria asignada anteriormente es insuficiente o superior a la requerida.
SYNTAX: - ptr = realloc (ptr, newsize);
Aquí, en los argumentos, primero, tenemos el puntero a la dirección de inicio del bloque existente y el segundo argumento es el tamaño del nuevo bloque que puede ser mayor o menor para que pueda especificar el nuevo tamaño.
Programa de ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void main()
{
int *ptr, i , n1, n2;
printf
("Enter size of array: ");
scanf
("%d", &n1);

ptr
= (int*) malloc(n1 * sizeof(int));

printf
("Address of previously allocated memory: ");
for(i = 0; i < n1; ++i)
printf
("%u\t",ptr + i);

printf
("\nEnter new size of array: ");
scanf
("%d", &n2);
// reallocating the memory of size n2
ptr
= realloc(ptr, n2 * sizeof(int));
for(i = 0; i < n2; ++i)
printf
("%u\t", ptr + i);
getch();
}
4. Función Libre
La memoria asignada dinámicamente creada mediante los métodos calloc () o malloc () no se libera por sí sola. Necesitamos usar explícitamente el método free () para liberar el espacio. Entonces, cuando necesitamos eliminar o liberar la memoria, se llama a la "función libre" .
SINTAXIS: - libre (ptr);