Adloun

Un tableau à deux dimensions de taille dynamique

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 1 — Le langage C

Énoncé

Écrire une fonction qui alloue une matrice de double, initialisée à zéro, en un seul bloc. Donner l'accès à l'élément .

Corrigé


/* Renvoie une matrice l x c de double, tous nuls, ou NULL en cas d'échec.
   L'élément (i, j) est à l'indice i*c + j. L'appelant devra faire free.
   Précondition : l >= 1 et c >= 1. */
double* matrice_nulle(int l, int c) {
    assert(l >= 1 && c >= 1);
    double* m = malloc((size_t) l * c * sizeof(double));
    if (m == NULL) { return NULL; }
    for (int k = 0; k < l * c; k = k + 1) { m[k] = 0.0; }
    return m;
}

/* usage */
double* m = matrice_nulle(3, 4);
m[1 * 4 + 2] = 3.14;      /* l'élément (1, 2) */
free(m);

Pourquoi un seul bloc plutôt qu'un tableau de pointeurs de lignes : un seul malloc et un seul free — donc une seule occasion de se tromper —, et des données contiguës en mémoire, donc lues plus vite par le processeur. Le prix est de calculer l'indice à la main.

Noter le transtypage (size_t) l * c : sans lui, le produit serait calculé en int et pourrait déborder avant d'être converti — c'est le défaut de l'exercice 1.2, à un endroit où on ne le cherche pas.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.