0Pricing
C Academy · Leçon

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

  1. Allouer un tableau
  2. Agrandir avec realloc
  3. Un type vecteur réutilisable
  4. Libérer la mémoire et éviter les fuites
← Retour à C Academy