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.