Uso de sizeof() para la asignación
Parte de la sección Logic & Flow 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 mantenible: 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 datos concreto en su sistema. En lugar de codificar de forma rígida los tamaños de los bytes, puede dejar que sizeof() calcule la cantidad correcta automáticamente:
// En lugar de adivinar los tamaños de bytes:
int *ptr = (int*)malloc(4); // Asume que int es de 4 bytes
// Use sizeof() para portabilidad:
int *ptr = (int*)malloc(sizeof(int)); // Siempre correctoEste enfoque resulta especialmente valioso al asignar arreglos. Para asignar espacio para múltiples elementos, multiplique el número de elementos por el tamaño de cada elemento:
// Asignar espacio para 10 enteros
int *arr = (int*)malloc(10 * sizeof(int));
// Asignar espacio para 5 doubles
double *values = (double*)malloc(5 * sizeof(double));El uso de sizeof() hace que su código funcione correctamente en diferentes sistemas donde los tipos de datos pueden tener diferentes tamaños, y comunica claramente su intención de asignar espacio para un número específico de elementos de un tipo particular.
Desafío
FácilEscriba un programa en C que demuestre el uso adecuado de sizeof() con malloc() para la asignación dinámica de memoria. Su programa debe:
- Leer un entero
ndel usuario que represente el número de elementos a asignar - Usar
malloc()consizeof()para asignar dinámicamente memoria para un arreglo denvalores de tipo double - Convertir (cast) el puntero void devuelto a un puntero de tipo double
- Leer
nvalores double del usuario y almacenarlos en el arreglo asignado - Calcular la memoria total asignada en bytes e imprimirla en el formato:
Memory allocated: [bytes] bytes - Calcular e imprimir el promedio de todos los valores con exactamente 2 decimales en el formato:
Average: [value] - Encontrar e imprimir el valor más grande con exactamente 2 decimales en el formato:
Largest: [value]
Recuerde incluir el encabezado <stdlib.h> para usar malloc(). Su programa debe demostrar cómo sizeof() garantiza una asignación de memoria correcta independientemente de los tamaños de los tipos de datos del sistema.
Por ejemplo, si la entrada es:
3
2.5 7.8 4.1Su salida debería ser:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Este desafío refuerza la importancia de usar sizeof() para que su asignación dinámica de memoria sea portable y mantenible, calculando automáticamente el número correcto de bytes necesarios para cualquier tipo de datos en cualquier sistema.
Hoja de referencia
Usa el operador sizeof() con malloc() para determinar el número correcto de bytes a asignar para cualquier tipo de dato:
// Asignación de memoria portable
int *ptr = (int*)malloc(sizeof(int));
// Asignando arreglos
int *arr = (int*)malloc(10 * sizeof(int));
double *values = (double*)malloc(5 * sizeof(double));El operador sizeof() devuelve el número de bytes requeridos para almacenar un tipo de dato en tu sistema, haciendo que tu código sea portable a través de diferentes plataformas donde los tipos de datos podrían tener diferentes tamaños.
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Leer el número de elementos
int n;
scanf("%d", &n);
// TODO: Escribe tu código a continuación
// 1. Asignar memoria para n valores double usando malloc() y sizeof()
// 2. Convertir el puntero devuelto a double*
// 3. Leer n valores double y almacenarlos en el arreglo asignado
// 4. Calcular e imprimir la memoria asignada en bytes
// 5. Calcular e imprimir el promedio con 2 decimales
// 6. Encontrar e imprimir el valor más grande 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 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