Un tipo de vector reutilizable
Agrupe el tamaño y la capacidad
Un tipo de vector reutilizable es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 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.
De código disperso a un tipo
Pasar un puntero, un contador y una capacidad como tres variables independientes es propenso a errores.
Vamos a agruparlos en una sola struct: un array dinámico reutilizable, al que normalmente se llama vector. Este agrupa los datos y la información de gestión.
La struct del vector
Un vector necesita tres campos: un puntero a los datos, cuántos elementos se están usando (len) y cuántos caben antes de cambiar el tamaño (cap).
typedef struct {
int *data;
size_t len;
size_t cap;
} Vec;Inicializar un vector
Un vector vacío tiene un puntero de datos NULL y una longitud y capacidad iguales a cero. Una pequeña función de inicialización deja clara la intención.
void vec_init(Vec *v) {
v->data = NULL;
v->len = 0;
v->cap = 0;
}La operación push
vec_push añade un elemento al final. Si el vector está lleno, primero duplica la capacidad.
Devuelve 0 si la operación tiene éxito y -1 si falla la asignación, para que el código que la llama pueda reaccionar.
int vec_push(Vec *v, int value) {
if (v->len == v->cap) {
size_t nc = v->cap ? v->cap * 2 : 4;
int *tmp = realloc(v->data, nc * sizeof(*v->data));
if (!tmp) return -1;
v->data = tmp;
v->cap = nc;
}
v->data[v->len++] = value;
return 0;
}Volver a leer los elementos
Como len registra la cantidad de elementos usados, debe iterar de 0 a len - 1. La capacidad puede ser mayor, pero esas posiciones todavía no forman parte de sus datos.
for (size_t i = 0; i < v->len; i++)
printf("%d\n", v->data[i]);Liberar el vector
Un vector es propietario de su buffer del heap, por lo que necesita una función de limpieza correspondiente. Después de liberarlo, restablezca los campos para evitar que la struct se use incorrectamente.
void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->len = v->cap = 0;
}Unirlo todo
Este programa completo construye un vector, inserta cinco valores, los imprime y finalmente lo libera de forma correcta.
#include <stdio.h>
#include <stdlib.h>
typedef struct { int *data; size_t len, cap; } Vec;
int vec_push(Vec *v, int value) {
if (v->len == v->cap) {
size_t nc = v->cap ? v->cap * 2 : 4;
int *tmp = realloc(v->data, nc * sizeof(*v->data));
if (!tmp) return -1;
v->data = tmp; v->cap = nc;
}
v->data[v->len++] = value;
return 0;
}
int main(void) {
Vec v = {0};
for (int i = 0; i < 5; i++) vec_push(&v, i * 10);
for (size_t i = 0; i < v.len; i++) printf("%d\n", v.data[i]);
free(v.data);
return 0;
}Inicializar a cero con {0}
Escribir Vec v = {0}; establece todos los campos a cero, incluido el puntero de datos a NULL.
Es un atajo práctico que deja el vector listo para vec_push sin llamar a una función de inicialización explícita.
Vec v = {0}; /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);Un helper get seguro
Indexar más allá de len es un error. Un pequeño accesorio puede comprobar los límites y señalar errores, a cambio de una ligera pérdida de velocidad en favor de la seguridad.
int vec_get(const Vec *v, size_t i, int *out) {
if (i >= v->len) return -1; /* out of range */
*out = v->data[i];
return 0;
}Por qué se controlan len y cap por separado
cap indica cuánta memoria está asignada; len indica cuánto utiliza realmente.
Mantener capacidad libre significa que la mayoría de las operaciones push no tienen que llamar a realloc. Esta separación es lo que hace que un vector sea rápido y flexible.
Generalizar el tipo
Este vector almacena int. Para admitir otros tipos, puede cambiar el tipo de elemento o almacenar void * junto con el tamaño de un elemento.
El patrón —init, push, free— es el mismo independientemente de lo que almacene.
typedef struct {
double *data;
size_t len, cap;
} DVec; /* same shape, different element type */Comprobación rápida
Compruebe su comprensión del tipo vector.
Resumen
Un vector agrupa un puntero a los datos, len y cap en una sola struct.
vec_push duplica la capacidad cuando está llena, vec_free libera el buffer y restablece los campos, y {0} inicializa todo correctamente. Este patrón reutilizable es mejor que manejar variables dispersas. A continuación: liberar correctamente y evitar fugas.
Preguntas frecuentes
¿La lección «Un tipo de vector reutilizable» es gratis?
Sí — el texto completo de «Un tipo de vector reutilizable» 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 «Un tipo de vector reutilizable»?
Agrupe el tamaño y la capacidad 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 3 de 4.
¿Cuánto tiempo toma la lección «Un tipo de vector reutilizable»?
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
- Asignar un array
- Aumentar con realloc
- Un tipo de vector reutilizable
- Liberar memoria y evitar fugas