C - Gestión de la memoria
Este capítulo explica la administración de memoria dinámica en C. El lenguaje de programación C proporciona varias funciones para la asignación y administración de memoria. Estas funciones se pueden encontrar en el<stdlib.h> archivo de cabecera.
No Señor. | Función descriptiva |
---|---|
1 | void *calloc(int num, int size); Esta función asigna una matriz de num elementos, cada uno de los cuales tendrá un tamaño en bytes size. |
2 | void free(void *address); Esta función libera un bloque de bloque de memoria especificado por dirección. |
3 | void *malloc(int num); Esta función asigna una matriz de num bytes y déjelos sin inicializar. |
4 | void *realloc(void *address, int newsize); Esta función reasigna la memoria extendiéndola hasta newsize. |
Asignar memoria dinámicamente
Mientras programa, si conoce el tamaño de una matriz, entonces es fácil y puede definirla como una matriz. Por ejemplo, para almacenar el nombre de cualquier persona, puede tener un máximo de 100 caracteres, por lo que puede definir algo de la siguiente manera:
char name[100];
Pero ahora consideremos una situación en la que no tiene idea de la longitud del texto que necesita almacenar, por ejemplo, desea almacenar una descripción detallada sobre un tema. Aquí necesitamos definir un puntero al carácter sin definir cuánta memoria se requiere y luego, según el requisito, podemos asignar memoria como se muestra en el siguiente ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* allocate memory dynamically */
description = malloc( 200 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Zara ali a DPS student in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado.
Name = Zara Ali
Description: Zara ali a DPS student in class 10th
El mismo programa se puede escribir usando calloc(); Lo único que necesita es reemplazar malloc con calloc de la siguiente manera:
calloc(200, sizeof(char));
Por lo tanto, tiene un control completo y puede pasar cualquier valor de tamaño mientras asigna memoria, a diferencia de las matrices donde una vez definido el tamaño, no puede cambiarlo.
Cambiar el tamaño y liberar la memoria
Cuando sale su programa, el sistema operativo libera automáticamente toda la memoria asignada por su programa, pero como una buena práctica cuando ya no necesita memoria, debe liberar esa memoria llamando a la función free().
Alternativamente, puede aumentar o disminuir el tamaño de un bloque de memoria asignado llamando a la función realloc(). Comprobemos el programa anterior una vez más y hagamos uso de las funciones realloc () y free () -
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* allocate memory dynamically */
description = malloc( 30 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy( description, "Zara ali a DPS student.");
}
/* suppose you want to store bigger description */
description = realloc( description, 100 * sizeof(char) );
if( description == NULL ) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcat( description, "She is in class 10th");
}
printf("Name = %s\n", name );
printf("Description: %s\n", description );
/* release memory using free() function */
free(description);
}
Cuando el código anterior se compila y ejecuta, produce el siguiente resultado.
Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th
Puede probar el ejemplo anterior sin reasignar memoria adicional, y la función strcat () dará un error debido a la falta de memoria disponible en la descripción.