Uso de sizeof() para la asignación
Parte de la sección Lógica y Flujo del Journey de C de Coddy. Lección 33 de 63.
Si bien malloc() te permite asignar memoria dinámicamente, existe una práctica recomendada importante que hace que tu código sea más portable y fácil de mantener: usar el operador sizeof() para determinar cuántos bytes asignar.
El operador sizeof() devuelve el número de bytes necesarios para almacenar un tipo de dato concreto en tu sistema. En lugar de codificar de forma rígida los tamaños en bytes, puedes dejar que sizeof() calcule automáticamente la cantidad correcta:
// En lugar de adivinar los tamaños en bytes:
int *ptr = (int*)malloc(4); // Supone que int ocupa 4 bytes
// Usa sizeof() para garantizar la portabilidad:
int *ptr = (int*)malloc(sizeof(int)); // Siempre correctoEste enfoque resulta especialmente útil al asignar memoria para arreglos. Para asignar espacio para varios elementos, multiplica el número de elementos por el tamaño de cada elemento:
// Reserva espacio para 10 enteros
int *arr = (int*)malloc(10 * sizeof(int));
// Reserva espacio para 5 valores de tipo double
double *values = (double*)malloc(5 * sizeof(double));Usar sizeof() hace que tu código funcione correctamente en diferentes sistemas donde los tipos de datos pueden tener tamaños distintos, y comunica claramente tu intención de asignar espacio para una cantidad específica de elementos de un tipo determinado.
Desafío
FácilEscribe un programa en C que demuestre el uso adecuado de sizeof() con malloc() para la asignación dinámica de memoria. Tu programa debe:
- Leer del usuario un entero
nque represente la cantidad de elementos que se van a asignar - Usar
malloc()consizeof()para asignar memoria dinámicamente para un arreglo denvalores double - Convertir el puntero void devuelto en un puntero a double
- Leer del usuario
nvalores double y almacenarlos en el arreglo asignado - Calcular la memoria total asignada en bytes e imprimirla con el formato:
Memory allocated: [bytes] bytes - Calcular e imprimir el promedio de todos los valores con exactamente 2 decimales, con el formato:
Average: [value] - Encontrar e imprimir el valor más grande con exactamente 2 decimales, con el formato:
Largest: [value]
Recuerda incluir el encabezado <stdlib.h> para usar malloc(). Tu programa debe demostrar cómo sizeof() garantiza la asignación correcta de memoria, independientemente del tamaño de los tipos de datos del sistema.
Por ejemplo, si la entrada es:
3
2.5 7.8 4.1Tu salida debe ser:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Este desafío refuerza la importancia de usar sizeof() para que tu asignación dinámica de memoria sea portable y fácil de mantener, calculando automáticamente la cantidad correcta de bytes necesarios para cualquier tipo de dato en cualquier sistema.
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Lee el número de elementos
int n;
scanf("%d", &n);
// TODO: Escribe tu código a continuación
// 1. Reserva memoria para n valores double usando malloc() y sizeof()
// 2. Convierte el puntero devuelto a double*
// 3. Lee n valores double y guárdalos en el arreglo reservado
// 4. Calcula e imprime la memoria reservada en bytes
// 5. Calcula e imprime el promedio con 2 decimales
// 6. Encuentra e imprime el valor más alto con 2 decimales
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