Un tipo Vector riutilizzabile
Incapsuli dimensione e capacità.
Un tipo Vector riutilizzabile è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.
Dal codice sparso a un tipo
Passare un puntatore, una quantità di elementi e una capacità come tre variabili separate è soggetto a errori.
Raggruppiamoli in una sola struct: un array dinamico riutilizzabile, spesso chiamato vector. In questo modo i dati e le informazioni di gestione vengono mantenuti insieme.
La struct del vector
Un vector richiede tre campi: un puntatore ai dati, il numero di elementi utilizzati (len) e il numero di elementi contenibili prima del ridimensionamento (cap).
typedef struct {
int *data;
size_t len;
size_t cap;
} Vec;Inizializzazione di un vector
Un vector vuoto ha un puntatore ai dati NULL e lunghezza e capacità pari a zero. Una piccola funzione di inizializzazione rende chiaro l'intento.
void vec_init(Vec *v) {
v->data = NULL;
v->len = 0;
v->cap = 0;
}L'operazione push
vec_push aggiunge un elemento alla fine. Se il vector è pieno, prima raddoppia la capacità.
Restituisce 0 in caso di successo e -1 se l'allocazione non riesce, consentendo al chiamante di reagire.
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;
}Lettura degli elementi
Poiché len tiene traccia del numero di elementi utilizzati, iteri da 0 a len - 1. La capacità potrebbe essere maggiore, ma quegli elementi non fanno ancora parte dei dati.
for (size_t i = 0; i < v->len; i++)
printf("%d\n", v->data[i]);Deallocazione del vector
Un vector possiede il proprio buffer nell'heap, quindi richiede una funzione di pulizia corrispondente. Dopo aver liberato la memoria, reimposti i campi per evitare un uso scorretto della struct.
void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->len = v->cap = 0;
}Assemblare il tutto
Questo programma completo crea un vector, inserisce cinque valori, li stampa e infine lo libera correttamente.
#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;
}Inizializzazione a zero con {0}
Scrivere Vec v = {0}; imposta a zero ogni campo, compreso il puntatore ai dati, che viene impostato su NULL.
È una comoda scorciatoia che prepara il vector per vec_push senza chiamare una funzione di inizializzazione esplicita.
Vec v = {0}; /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);Un helper get sicuro
Indicizzare oltre len è un errore. Un piccolo accessor può controllare i limiti e segnalare gli errori, rinunciando a un po' di velocità in favore della sicurezza.
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;
}Perché tenere separati len e cap
cap indica quanta memoria è allocata; len indica quanta ne viene effettivamente utilizzata.
Mantenere una capacità aggiuntiva fa sì che la maggior parte delle operazioni di push non debba chiamare realloc. Questa separazione rende il vector rapido e flessibile.
Generalizzazione del tipo
Questo vector memorizza valori di tipo int. Per contenere altri tipi, può modificare il tipo degli elementi oppure utilizzare void * insieme alla dimensione di un elemento.
Lo schema — init, push, free — rimane invariato indipendentemente da ciò che viene memorizzato.
typedef struct {
double *data;
size_t len, cap;
} DVec; /* same shape, different element type */Controllo rapido
Verifichi la propria comprensione del tipo vector.
Riepilogo
Un vector raggruppa in un'unica struct un puntatore ai dati, len e cap.
vec_push raddoppia la capacità quando il vector è pieno, vec_free libera il buffer e reimposta i campi, mentre {0} esegue un'inizializzazione corretta. Questo schema riutilizzabile è preferibile alla gestione di variabili separate. Prossimo argomento: liberare correttamente la memoria ed evitare le perdite.
Domande Frequenti
La lezione «Un tipo Vector riutilizzabile» è gratuita?
Sì — il testo completo di «Un tipo Vector riutilizzabile» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.
Cosa imparerò in «Un tipo Vector riutilizzabile»?
Incapsuli dimensione e capacità. Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C Academy?
Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Un tipo Vector riutilizzabile»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C Academy?
Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Allocare un array
- Crescere con realloc
- Un tipo Vector riutilizzabile
- Liberare la memoria ed evitare perdite