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.

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 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 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.

challenge icon

Desafío

Fácil

Escriba un programa en C que demuestre el uso adecuado de sizeof() con malloc() para la asignación dinámica de memoria. Su 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]

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.1

Su 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 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;
}
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