Un type vecteur réutilisable
Encapsulez la taille et la capacité.
Un type vecteur réutilisable est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C Academy comprend 4 leçons au total.
Du code dispersé à un type
Faire circuler un pointeur, un nombre d'éléments et une capacité dans trois variables distinctes est source d'erreurs.
Regroupons-les dans une seule struct : un tableau dynamique réutilisable, souvent appelé vecteur. Il rassemble les données et leur gestion au même endroit.
La structure du vecteur
Un vecteur a besoin de trois champs : un pointeur vers les données, le nombre d'éléments utilisés (len) et le nombre d'éléments possibles avant un redimensionnement (cap).
typedef struct {
int *data;
size_t len;
size_t cap;
} Vec;Initialiser un vecteur
Un vecteur vide possède un pointeur de données NULL, ainsi qu'une longueur et une capacité nulles. Une petite fonction d'initialisation rend l'intention claire.
void vec_init(Vec *v) {
v->data = NULL;
v->len = 0;
v->cap = 0;
}L'opération d'ajout
vec_push ajoute un élément à la fin. Si le vecteur est plein, sa capacité est d'abord doublée.
La fonction renvoie 0 en cas de succès et -1 si l'allocation échoue, afin que l'appelant puisse réagir.
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;
}Relire les éléments
Puisque len suit le nombre d'éléments utilisés, parcourez les indices de 0 à len - 1. La capacité peut être supérieure, mais ces emplacements ne font pas encore partie de vos données.
for (size_t i = 0; i < v->len; i++)
printf("%d\n", v->data[i]);Libérer le vecteur
Un vecteur est propriétaire de son tampon du tas ; il a donc besoin d'une fonction de nettoyage correspondante. Après la libération, réinitialisez les champs afin d'éviter toute mauvaise utilisation de la structure.
void vec_free(Vec *v) {
free(v->data);
v->data = NULL;
v->len = v->cap = 0;
}Assembler le tout
Ce programme complet construit un vecteur, y ajoute cinq valeurs, les affiche, puis le libère proprement.
#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;
}Initialiser à zéro avec {0}
L'écriture Vec v = {0}; met tous les champs à zéro, y compris le pointeur de données, qui prend la valeur NULL.
Cette abréviation pratique prépare un vecteur à recevoir vec_push sans appeler de fonction d'initialisation explicite.
Vec v = {0}; /* data=NULL, len=0, cap=0 */
vec_push(&v, 42);Un assistant get sûr
Accéder à un indice au-delà de len est une erreur. Un petit accesseur peut vérifier les limites et signaler les erreurs, au prix d'une légère perte de rapidité.
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;
}Pourquoi suivre len et cap séparément
cap indique la quantité de mémoire allouée ; len indique la quantité réellement utilisée.
Conserver une capacité disponible permet à la plupart des ajouts de ne pas appeler realloc. Cette séparation rend le vecteur à la fois rapide et flexible.
Généraliser le type
Ce vecteur stocke des int. Pour contenir d'autres types, vous pouvez modifier le type des éléments ou stocker des void * avec la taille d'un élément.
Le principe — initialisation, ajout, libération — reste le même, quel que soit le contenu stocké.
typedef struct {
double *data;
size_t len, cap;
} DVec; /* same shape, different element type */Vérification rapide
Vérifiez votre compréhension du type vecteur.
Récapitulatif
Un vecteur regroupe un pointeur de données, len et cap dans une seule structure.
vec_push double la capacité lorsqu'elle est atteinte, vec_free libère le tampon et réinitialise les champs, et {0} effectue une initialisation propre. Ce modèle réutilisable est préférable à la manipulation de variables dispersées. Ensuite : libérer correctement la mémoire et éviter les fuites.
Questions Fréquemment Posées
La leçon « Un type vecteur réutilisable » est-elle gratuite ?
Oui — le texte complet de « Un type vecteur réutilisable » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C Academy, passe à CoddyKit PRO. Le cours C Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Un type vecteur réutilisable » ?
Encapsulez la taille et la capacité. Tu pratiques C Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C Academy ?
Aucune expérience préalable n'est requise. C Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Un type vecteur réutilisable » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C Academy ?
Oui. Chaque leçon C Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Allouer un tableau
- Agrandir avec realloc
- Un type vecteur réutilisable
- Libérer la mémoire et éviter les fuites