0Pricing
C Academy · Lección

calloc y realloc

Memoria puesta a cero y redimensionada

calloc y realloc es una lección gratuita de C Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.

Más allá de malloc

Además de malloc, la biblioteca estándar ofrece calloc para obtener memoria inicializada a cero y realloc para cambiar el tamaño de un bloque existente.

Ambas funciones se encuentran en <stdlib.h>.

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

int main(void) {
    int *p = calloc(3, sizeof(int));
    printf("%d %d %d\n", p[0], p[1], p[2]);
    free(p);
    return 0;
}

calloc pone la memoria a cero

calloc(count, size) asigna espacio para count elementos de size bytes y establece cada byte en cero.

Es práctico cuando necesita empezar con un estado limpio.

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

int main(void) {
    int *a = calloc(5, sizeof(int));
    int sum = 0;
    for (int i = 0; i < 5; i++) sum += a[i];
    printf("sum of zeroed array = %d\n", sum);
    free(a);
    return 0;
}

calloc tiene dos argumentos

A diferencia de malloc, calloc recibe por separado la cantidad de elementos y el tamaño de cada elemento.

Además, evita el desbordamiento al multiplicar la cantidad por el tamaño.

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

int main(void) {
    double *d = calloc(4, sizeof(double));
    d[2] = 1.5;
    printf("%f %f\n", d[0], d[2]);
    free(d);
    return 0;
}

malloc frente a calloc

Use malloc cuando vaya a sobrescribir todos los bytes de todos modos, y calloc cuando necesite que la memoria comience a cero.

calloc cuesta un poco más debido a la puesta a cero.

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

int main(void) {
    int *m = malloc(2 * sizeof(int));
    int *c = calloc(2, sizeof(int));
    m[0] = 5; m[1] = 6;
    printf("malloc: %d %d\n", m[0], m[1]);
    printf("calloc: %d %d\n", c[0], c[1]);
    free(m); free(c);
    return 0;
}

Ampliar con realloc

realloc(ptr, newsize) cambia el tamaño de un bloque y conserva su contenido existente hasta el menor de los tamaños antiguo y nuevo.

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

int main(void) {
    int *a = malloc(2 * sizeof(int));
    a[0] = 1; a[1] = 2;
    a = realloc(a, 4 * sizeof(int));
    a[2] = 3; a[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    free(a);
    return 0;
}

realloc puede mover el bloque

realloc puede devolver una dirección diferente si reubica el bloque para encontrar espacio.

Asigne siempre el resultado y no siga usando el puntero antiguo.

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

int main(void) {
    int *a = malloc(sizeof(int));
    a[0] = 42;
    int *bigger = realloc(a, 100 * sizeof(int));
    printf("first element still %d\n", bigger[0]);
    free(bigger);
    return 0;
}

Patrón seguro para realloc

Si realloc falla, devuelve NULL, pero deja intacto el bloque original.

Asigne primero el resultado a una variable temporal para no perder el puntero antiguo si se produce un error.

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

int main(void) {
    int *a = malloc(2 * sizeof(int));
    int *tmp = realloc(a, 8 * sizeof(int));
    if (tmp == NULL) {
        free(a);
        return 1;
    }
    a = tmp;
    a[7] = 99;
    printf("%d\n", a[7]);
    free(a);
    return 0;
}

Reducir un bloque

realloc también puede reducir un bloque. Los elementos iniciales se conservan; el resto se libera.

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

int main(void) {
    int *a = malloc(6 * sizeof(int));
    for (int i = 0; i < 6; i++) a[i] = i;
    a = realloc(a, 3 * sizeof(int));
    printf("%d %d %d\n", a[0], a[1], a[2]);
    free(a);
    return 0;
}

Un búfer que crece

Un patrón habitual duplica la capacidad cuando un array se llena, distribuyendo el coste del crecimiento.

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

int main(void) {
    int cap = 2, len = 0;
    int *a = malloc(cap * sizeof(int));
    for (int v = 0; v < 5; v++) {
        if (len == cap) {
            cap *= 2;
            a = realloc(a, cap * sizeof(int));
        }
        a[len++] = v;
    }
    printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
    free(a);
    return 0;
}

realloc con NULL

realloc(NULL, size) se comporta exactamente como malloc(size).

Esto permite que una rutina de crecimiento gestione de forma uniforme la primera asignación.

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

int main(void) {
    int *a = realloc(NULL, 3 * sizeof(int));
    a[0] = 7;
    printf("%d\n", a[0]);
    free(a);
    return 0;
}

Combinarlas

Puede comenzar con calloc para obtener un búfer puesto a cero y ampliarlo más adelante con realloc. Los bytes nuevos después de una ampliación no se ponen a cero.

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

int main(void) {
    int *a = calloc(2, sizeof(int));
    a = realloc(a, 4 * sizeof(int));
    a[2] = 0; a[3] = 0;
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    free(a);
    return 0;
}

Comprobación rápida

Compruebe sus conocimientos sobre calloc y realloc.

Resumen

Ha aprendido dos herramientas de asignación más:

  • calloc(count, size) asigna memoria puesta a cero y evita el desbordamiento de la multiplicación.
  • realloc(ptr, newsize) cambia el tamaño de un bloque y puede moverlo.
  • Asigne siempre el resultado de realloc a una variable temporal para evitar fugas si se produce un error.
  • realloc(NULL, size) actúa como malloc.

Preguntas frecuentes

¿La lección «calloc y realloc» es gratis?

Sí — el texto completo de «calloc y realloc» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.

¿Qué aprenderé en «calloc y realloc»?

Memoria puesta a cero y redimensionada Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C Academy?

No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «calloc y realloc»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C Academy?

Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. malloc y free
  2. calloc y realloc
  3. Fugas de memoria
  4. Punteros colgantes
← Volver a C Academy