Menu
Coddy logo textTech

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.

Mientras que 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 particular 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 los bytes:
int *ptr = (int*)malloc(4);  // Asume que int es de 4 bytes

// Use sizeof() para portabilidad:
int *ptr = (int*)malloc(sizeof(int));  // Siempre correcto

Este 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 tu código funcione correctamente en diferentes sistemas donde los tipos de datos pueden tener diferentes tamaños, y comunica claramente tu intención de asignar espacio para un número específico de elementos de un tipo particular.

challenge icon

Desafío

Fácil

Escribe un programa en C que demuestre el uso adecuado de sizeof() con malloc() para la asignación dinámica de memoria. Tu programa debe:

  1. Leer un entero n del usuario que represente el número de elementos a asignar
  2. Usar malloc() con sizeof() para asignar dinámicamente memoria para un arreglo de n valores de tipo double
  3. Convertir (cast) el puntero void devuelto a un puntero de tipo double
  4. Leer n valores double del usuario y almacenarlos en el arreglo asignado
  5. Calcular la memoria total asignada en bytes e imprimirla en el formato: Memory allocated: [bytes] bytes
  6. Calcular e imprimir el promedio de todos los valores con exactamente 2 decimales en el formato: Average: [value]
  7. Encontrar e imprimir el valor más grande con exactamente 2 decimales en el formato: Largest: [value]

Recuerda incluir el encabezado <stdlib.h> para usar malloc(). Tu 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.1

Tu salida debería ser:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

Este 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 el número correcto 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. Asigna memoria para n valores double usando malloc() y sizeof()
    // 2. Convierte el puntero devuelto a double*
    // 3. Lee n valores double y almacénalos en el arreglo asignado
    // 4. Calcula e imprime la memoria asignada en bytes
    // 5. Calcula e imprime el promedio con 2 decimales
    // 6. Encuentra e imprime el valor más grande con 2 decimales
    
    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