Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Gestión Dinámica de Memoria en C: calloc, malloc y free Explicados

Este capítulo explica la gestión dinámica de memoria en C. El lenguaje C proporciona varias funciones para la asignación y gestión de memoria. Estas funciones se encuentran en el archivo de cabecera <stdlib.h>.

Nº Función y Descripción
1 void *calloc(int num, int size);
Asigna un array de num elementos, cada uno de size bytes.
2 void free(void *address);
Libera un bloque de memoria especificado por la dirección.
3 void *malloc(size_t size);
Asigna un array de size bytes y lo deja sin inicializar.
4 void *realloc(void *address, int newsize);
Reasigna memoria extendiéndola hasta newsize.

Asignación Dinámica de Memoria

Al programar, si conoce el tamaño de un array, es fácil definirlo como tal. Por ejemplo, para almacenar el nombre de una persona, puede llegar hasta 100 caracteres, así que puede definir:

char name[100];

Pero considere una situación donde no sabe la longitud del texto a almacenar, por ejemplo, una descripción detallada. Aquí necesitamos definir un puntero a carácter sin definir cuánta memoria se requiere y luego, según necesidad, asignar memoria como en el siguiente ejemplo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char name[100];
    char *description;
    strcpy(name, "Zara Ali");
    /* asigna memoria dinámicamente */
    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);
}

Al compilar y ejecutar, produce:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

El mismo programa puede escribirse usando calloc(); solo necesita reemplazar malloc por calloc así:

calloc(200, sizeof(char));

Así tiene control total y puede pasar cualquier valor de tamaño al asignar memoria, a diferencia de los arrays donde una vez definido el tamaño no puede cambiarse.

Redimensionar y Liberar Memoria

Cuando el programa termina, el sistema operativo libera automáticamente toda la memoria asignada, pero como buena práctica, cuando ya no necesite la memoria, debe liberarla llamando a la función free().

Alternativamente, puede aumentar o disminuir el tamaño de un bloque de memoria asignado llamando a realloc(). Veamos el programa anterior de nuevo usando realloc() y free():

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char name[100];
    char *description;
    strcpy(name, "Zara Ali");
    /* asigna memoria dinámicamente */
    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.");
    }
    /* supongamos que quiere almacenar una descripción mayor */
    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);
    /* libera memoria usando free() */
    free(description);
}

Al compilar y ejecutar, produce:

Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th

Puede probar el ejemplo anterior sin reasignar memoria extra, y la función strcat() dará error por falta de memoria disponible en description.

Lenguaje C

  1. Entendiendo Memorias Digitales No Mecánicas: SRAM, DRAM y Flash
  2. Entendiendo ROM, PROM, EPROM y EEPROM: Diseño, Programación e Identificación
  3. Microprocesadores: La Evolución de la Computación con Programa Almacenado
  4. Eventos de Gestión de Activos 2012: Principales Conferencias, Formación y Exposiciones
  5. 4 objetivos clave para una gestión de activos efectiva
  6. Manual Definitivo de Gestión de Mantenimiento: Guía Práctica para Líderes
  7. Dominando la gestión de memoria en C++: uso experto de new y delete
  8. Asignación dinámica de memoria en C: Dominando malloc, calloc, realloc y free
  9. Dominando la Memoria Dinámica en C++: Stack vs Heap Explicado
  10. Comentarios de documentación en Java: Dominando Javadoc y tipos de comentarios
  11. Mejoras en Java 10: Asignar Heap en NV-DIMM con -XX:AllocateHeapAt