Menu
Coddy logo textTech

Asignación con calloc()

Parte de la sección Logic & Flow del Journey de C de Coddy — lección 36 de 63.

Mientras que malloc() es la función más común para la asignación dinámica de memoria, C proporciona otra alternativa útil: calloc(). La función calloc(), que significa "asignación contigua", ofrece una forma conveniente de asignar memoria para arreglos con un beneficio adicional importante.

A diferencia de malloc() que toma un solo argumento (bytes totales), calloc() toma dos argumentos: el número de elementos que deseas asignar y el tamaño de cada elemento. Esto lo hace particularmente intuitivo cuando se trabaja con arreglos. Por ejemplo:

#include <stdlib.h>

// Asignar espacio para 5 enteros usando calloc()
int *arr = (int*)calloc(5, sizeof(int));

// Esto es equivalente a: malloc(5 * sizeof(int))

La ventaja clave de calloc() es que inicializa automáticamente toda la memoria asignada a cero. Cuando usas malloc(), la memoria asignada contiene cualquier valor aleatorio que estuviera almacenado allí previamente, pero calloc() garantiza que cada byte se establezca en cero. Esto significa que todos los enteros serán 0, todos los flotantes serán 0.0 y todos los punteros serán NULL.

Al igual que malloc(), calloc() devuelve un puntero a la memoria asignada o NULL si la asignación falla, por lo que siempre debes comprobar si hubo un error de asignación y recordar liberar la memoria con free() cuando hayas terminado de usarla.

challenge icon

Desafío

Fácil

Escribe un programa en C que demuestre el uso de calloc() para la asignación dinámica de memoria con inicialización automática a cero. Tu programa debe:

  1. Leer un entero size del usuario que represente la cantidad de enteros a asignar
  2. Usar calloc() para asignar dinámicamente memoria para un arreglo de size enteros
  3. Verificar si la asignación de memoria fue exitosa; si falla, imprimir Memory allocation failed! y terminar el programa
  4. Si la asignación tiene éxito, imprimir Memory allocated and initialized to zero!
  5. Imprimir todos los valores iniciales en el arreglo para demostrar que son cero, en el formato: Initial values: [value1] [value2] [value3] ...
  6. Leer size valores enteros del usuario y almacenarlos en el arreglo asignado
  7. Imprimir todos los valores actualizados en el formato: Updated values: [value1] [value2] [value3] ...
  8. Calcular e imprimir la suma de todos los valores en el formato: Sum: [value]
  9. Usar free() para liberar la memoria
  10. Imprimir Memory freed! para confirmar la limpieza

Recuerda incluir el encabezado <stdlib.h> para usar calloc() y free(). Este desafío demuestra la ventaja clave de calloc() sobre malloc(): la inicialización automática de toda la memoria asignada a cero.

Por ejemplo, si la entrada es:

3
10 20 30

Tu salida debería ser:

Memory allocated and initialized to zero!
Initial values: 0 0 0
Updated values: 10 20 30
Sum: 60
Memory freed!

Este desafío resalta cómo calloc() proporciona un estado inicial limpio y predecible para tus arreglos asignados dinámicamente, eliminando los valores basura impredecibles que malloc() podría dejar.

Hoja de referencia

La función calloc() proporciona asignación dinámica de memoria con inicialización automática a cero.

Sintaxis:

void* calloc(size_t num_elements, size_t element_size);

Diferencias clave con malloc():

  • Toma dos argumentos: número de elementos y tamaño de cada elemento
  • Inicializa automáticamente toda la memoria asignada a cero
  • Más intuitivo para la asignación de arreglos

Ejemplo de uso:

#include <stdlib.h>

// Asignar espacio para 5 enteros usando calloc()
int *arr = (int*)calloc(5, sizeof(int));

// Esto es equivalente a: malloc(5 * sizeof(int))
// Pero se garantiza que todos los valores sean 0

Al igual que malloc(), calloc() devuelve un puntero a la memoria asignada o NULL si la asignación falla. Siempre verifique si hay fallos en la asignación y use free() para liberar la memoria cuando haya terminado.

Pruébalo tú mismo

#include <stdio.h>
#include <stdlib.h>

int main() {
    int size;
    
    // Leer el tamaño del arreglo
    scanf("%d", &size);
    
    // TODO: Escribe tu código a continuación
    // Usa calloc() para asignar memoria para el arreglo
    // Verifica si la asignación fue exitosa
    // Imprime los valores iniciales (deberían ser cero)
    // Lee y almacena los valores de entrada
    // Imprime los valores actualizados
    // Calcula e imprime la suma
    // Libera la memoria asignada
    
    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