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.
Desafío
FácilEscribe 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:
- Leer un entero
ndel usuario que represente la cantidad de enteros a almacenar - Usar
malloc()consizeof()para asignar memoria dinámicamente para un arreglo denenteros - Verificar si la asignación de memoria fue exitosa comprobando si el puntero devuelto es
NULL - Si la asignación falla, imprimir
Memory allocation failed!y terminar el programa - Si la asignación tiene éxito, imprimir
Memory allocation successful! - Leer
nvalores enteros del usuario y almacenarlos en el arreglo asignado - Calcular e imprimir la suma de todos los valores en el formato:
Sum: [value] - 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 40Tu salida debería ser:
Memory allocation successful!
Sum: 100
Bytes allocated: 16Este 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;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas6Gestión de memoria
Memoria Stack vs. HeapAsignación dinámica - malloc()Uso de sizeof() para la asignaciónComprobación de fallos de asignaciónLiberación de memoria con free()Asignación con calloc()Resumen: Arrays dinámicos