Menu
Coddy logo textTech

Comprobación de fallos de asignación

Parte de la sección Logic & Flow del Journey de C de Coddy — lección 34 de 63.

Si bien malloc() es una herramienta poderosa para la asignación dinámica de memoria, hay una realidad crítica que debes entender: malloc() puede fallar. Cuando el sistema se queda sin memoria disponible, malloc() no puede cumplir con tu solicitud y devuelve NULL en lugar de una dirección de memoria válida.

Esto significa que cada vez que uses malloc(), debes comprobar si tuvo éxito antes de intentar usar el puntero devuelto. El uso de un puntero NULL hará que tu programa se bloquee con un fallo de segmentación.

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

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Salir del programa o manejar el error
}

// Es seguro usar ptr aquí
*ptr = 42;

Esta comprobación de NULL no es opcional; es esencial para escribir programas en C robustos. Incluso si los fallos de asignación de memoria son poco comunes en los sistemas modernos, pueden ocurrir, especialmente en entornos con recursos limitados o al solicitar grandes cantidades de memoria. El código C profesional siempre incluye estas comprobaciones para evitar bloqueos y proporcionar un manejo de errores adecuado.

challenge icon

Desafío

Fácil

Escribe un programa en C que demuestre el manejo adecuado de errores al usar malloc() para la asignación dinámica de memoria. Tu programa debe:

  1. Leer un entero n del usuario que represente la cantidad de enteros a almacenar
  2. Usar malloc() con sizeof() para asignar memoria dinámicamente para un arreglo de n enteros
  3. Verificar si la asignación de memoria fue exitosa comprobando si el puntero devuelto es NULL
  4. Si la asignación falla, imprimir Memory allocation failed! y terminar el programa
  5. Si la asignación tiene éxito, imprimir Memory allocation successful!
  6. Leer n valores enteros del usuario y almacenarlos en el arreglo asignado
  7. Calcular e imprimir la suma de todos los valores en el formato: Sum: [value]
  8. Imprimir el total de bytes asignados en el formato: Bytes allocated: [value]

Recuerda incluir el encabezado <stdlib.h> para usar malloc(). Tu programa debe demostrar la práctica esencial de verificar fallos en la asignación antes de intentar usar la memoria asignada.

Por ejemplo, si la entrada es:

4
10 20 30 40

Tu salida debería ser:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Este desafío enfatiza la importancia crítica de la programación defensiva al trabajar con la asignación dinámica de memoria, asegurando que tus programas manejen los posibles fallos de asignación de memoria de manera adecuada en lugar de cerrarse inesperadamente.

Hoja de referencia

Comprueba siempre si malloc() devuelve NULL antes de usar la memoria asignada:

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

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Salir del programa o manejar el error
}

// Es seguro usar ptr aquí
*ptr = 42;

malloc() puede fallar cuando el sistema se queda sin memoria disponible. El uso de un puntero NULL provocará un fallo de segmentación. Esta comprobación de NULL es esencial para escribir programas en C robustos y evitar bloqueos.

Pruébalo tú mismo

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Leer el número de enteros
    int n;
    scanf("%d", &n);
    
    // TODO: Escribe tu código aquí
    // - Usa malloc() para asignar memoria para n enteros
    // - Verifica si la asignación fue exitosa
    // - Maneja tanto los casos de éxito como de fallo
    // - Lee los enteros y almacénalos
    // - Calcula la suma y los bytes asignados
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow