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
- Crecer duplicando mantiene el costo amortizado constante.
- Si
reallocfalla devuelve NULL y el bloque viejo sobrevive. - Así que asigna a un temporal y solo entonces reemplaza el puntero.
Palabras clave y builtins usados aquí
NULLifintreturnsize_tsizeof
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.
Paso 4 de 5 en Memoria dinámica; paso 13 de 25 en Punteros y memoria.