0Pricing
C Academy · Lección

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

  1. Asignar un array
  2. Aumentar con realloc
  3. Un tipo de vector reutilizable
  4. Liberar memoria y evitar fugas
← Volver a C Academy