Comprobación de fallos de asignación
Parte de la sección Lógica y Flujo del Journey de C de Coddy. Lección 34 de 63.
Aunque malloc() es una herramienta potente para la asignación dinámica de memoria, hay una realidad crítica que debes comprender: malloc() puede fallar. Cuando el sistema se queda sin memoria disponible, malloc() no puede cumplir 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. Usar un puntero NULL hará que tu programa se bloquee con un error 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 robustos en C. Aunque los fallos de asignación de memoria son poco frecuentes 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 adecuado de los errores.
Desafío
FácilEscribe un programa en C que demuestre un 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 el número de enteros que se almacenarán - Usar
malloc()consizeof()para asignar dinámicamente memoria para un arreglo denenteros - Comprobar si la asignación de memoria se realizó correctamente verificando 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 con el formato:
Sum: [value] - Imprimir el total de bytes asignados con el formato:
Bytes allocated: [value]
Recuerda incluir el encabezado <stdlib.h> para usar malloc(). Tu programa debe demostrar la práctica esencial de comprobar si la asignación falla antes de intentar usar la memoria asignada.
Por ejemplo, si la entrada es:
4
10 20 30 40La salida debe ser:
Memory allocation successful!
Sum: 100
Bytes allocated: 16Este desafío enfatiza la importancia fundamental de la programación defensiva al trabajar con asignación dinámica de memoria, garantizando que tus programas gestionen correctamente los posibles fallos de asignación de memoria en lugar de bloquearse inesperadamente.
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Lee el número de enteros
int n;
scanf("%d", &n);
// TODO: Escribe tu código aquí
// - Usa malloc() para asignar memoria para n enteros
// - Comprueba si la asignación fue exitosa
// - Maneja tanto los casos de éxito como de fallo
// - Lee los enteros y almacénalos
// - Calculate the sum and bytes allocated
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
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ámicosPractica por tu cuenta: Compilador de C online