typestar

Hacer crecer un búfer en C

Duplicar bajo demanda, y nunca asignar el resultado de realloc sobre tu único puntero.

#include <stdlib.h>

int push(int **values, size_t *len, size_t *cap, int value) {
    if (*len == *cap) {
        size_t bigger = (*cap == 0) ? 4 : *cap * 2;
        int *grown = realloc(*values, bigger * sizeof(int));
        if (grown == NULL) {
            return 0;
        }
        *values = grown;
        *cap = bigger;
    }
    (*values)[*len] = value;
    (*len)++;
    return 1;
}

Cómo funciona

  1. Crecer duplicando mantiene el costo amortizado constante.
  2. Si realloc falla devuelve NULL y el bloque viejo sobrevive.
  3. Así que asigna a un temporal y solo entonces reemplaza el puntero.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
16
Caracteres a escribir
313
Tokens
113
Ritmo de tres estrellas
95 tpm

Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 71 segundos.

Escribe este fragmento

Paso 4 de 5 en Memoria dinámica; paso 13 de 25 en Punteros y memoria.

← Anterior Siguiente →