0Pricing
C Academy · Leçon

Allouer un tableau

Réservez de la mémoire sur le tas.

Allouer un tableau est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 1 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.

Pourquoi des tableaux dynamiques ?

Un tableau normal a une taille fixe définie au moment de la compilation. Or, vous ne savez souvent pas combien d’éléments seront nécessaires avant l’exécution du programme.

Les tableaux dynamiques résolvent ce problème : vous demandez au système d’exploitation un bloc de mémoire à l’exécution avec malloc, puis vous déterminez sa taille au moyen d’une variable.

Découvrez malloc

malloc (allocation de mémoire) se trouve dans <stdlib.h>. Vous lui transmettez un nombre d’octets et il renvoie un pointeur vers ce bloc, ou NULL en cas d’échec.

La mémoire provient du tas et reste disponible jusqu’à ce que vous la libériez.

int *p = malloc(10 * sizeof(int));

Dimensionner avec sizeof

Ne codez jamais en dur le nombre d’octets. Utilisez sizeof afin que votre code reste correct sur toutes les plateformes.

Pour réserver de l’espace pour n entiers, multipliez n par sizeof(int). Une expression courante est n * sizeof(*p), qui utilise le type propre au pointeur.

int *p = malloc(n * sizeof(*p));

Vérifiez toujours NULL

Si le système n’a plus de mémoire, malloc renvoie NULL. Déréférencer un pointeur NULL fait planter votre programme.

Vérifiez le résultat avant de l’utiliser. Cette simple habitude évite de nombreux échecs difficiles à diagnostiquer.

int *p = malloc(n * sizeof(*p));
if (p == NULL) {
    fprintf(stderr, "out of memory\n");
    return 1;
}

Une allocation complète

Voici un programme complet qui réserve de la place pour 5 entiers, les remplit et les affiche.

Remarquez la symétrie : malloc au début et free à la fin.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) a[i] = i * i;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

malloc n’initialise pas à zéro

La mémoire obtenue avec malloc n’est pas initialisée : elle contient les valeurs indéterminées qui s’y trouvaient auparavant.

La lire avant d’y écrire produit des valeurs imprévisibles. Affectez toujours une valeur à chaque élément avant de le lire.

int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;

calloc initialise à zéro pour vous

calloc(count, size) réserve de la place pour count éléments de size octets et initialise chaque octet à zéro.

Utilisez-le lorsque vous voulez un tableau propre, rempli de zéros. Il protège également contre le dépassement de capacité lors de la multiplication.

int *a = calloc(5, sizeof(*a));
/* every element is now 0 */

calloc en action

Ce programme utilise calloc et confirme que le tableau commence à zéro avant que nous le modifiions.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 4;
    int *a = calloc(n, sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

Accéder aux éléments du bloc

Un pointeur vers un bloc du tas se comporte comme un nom de tableau. Vous pouvez utiliser a[i] pour lire et écrire n’importe quel élément de 0 à n-1.

En interne, a[i] est équivalent à *(a + i).

int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2;   /* same as a[1] = 2 */
a[2] = 3;

Surveillez les limites

Si vous allouez n éléments, les indices valides vont de 0 à n-1. Écrire dans a[n] produit un comportement indéfini.

Le langage C ne vérifie pas les limites à votre place ; une erreur de décalage d’une unité peut donc corrompre la mémoire silencieusement.

int *a = malloc(3 * sizeof(*a));
a[2] = 99;   /* OK, last valid index */
/* a[3] = 0;  BUG: out of bounds */

Lire la taille à l’exécution

La véritable puissance vient du fait que la taille peut provenir d’une entrée, d’un fichier ou d’un calcul. Le même code peut allouer 2 ou 2 millions d’éléments.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 6;            /* could be scanf'd */
    long *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    long sum = 0;
    for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
    printf("%ld\n", sum);
    free(a);
    return 0;
}

Vérification rapide

Vérifiez votre compréhension de l’allocation.

Récapitulatif

Vous allouez un tableau dynamique avec malloc(n * sizeof(*p)) ou un tableau rempli de zéros avec calloc(n, sizeof(*p)).

Vérifiez toujours NULL, souvenez-vous que malloc laisse des valeurs indéterminées, utilisez les indices de 0 à n-1 et associez chaque allocation à un appel à free. Vous apprendrez ensuite à redimensionner un bloc tout en conservant ses données.

Questions Fréquemment Posées

La leçon « Allouer un tableau » est-elle gratuite ?

Oui — le texte complet de « Allouer un tableau » 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 « Allouer un tableau » ?

Réservez de la mémoire sur le tas. 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 1 sur 4.

Combien de temps prend la leçon « Allouer un tableau » ?

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