Allouer dynamiquement un tableau à deux dimensions avec uniquement deux malloc

Ce qu'il ne faut pas faire
Beaucoup de gens font un truc du genre :
int **createTable(int nbLin, int nbCol){ int **tab; /* Allocation de la 1er dimension */ tab = (int **)malloc ( sizeof(int *) * nbLin); /* Allocation 2e dimension */ for (int i = 0 ; i < nbLin ; i++){ tab[i] = (int *)malloc (sizeof(int) * nbCol); }
Ce qui demande nbLin+1 malloc (c'est moche). Il faut savoir que l'allocation mémoire est considérée comme une action lente.
Ce qu'il faudrait faire
Une autre méthode consiste à allouer la première dimension comme dans l'exemple précédent, et a allouer d'un seul bloc, tout le reste.
#include <stdlib.h> #include <stdio.h> int **createTable(int nbLin, int nbCol){ int **tableau = (int **)malloc(sizeof(int*)*nbLin); int *tableau2 = (int *)malloc(sizeof(int)*nbCol*nbLin); for(int i = 0 ; i < nbLin ; i++){ tableau[i] = &tableau2[i*nbCol]; } return tableau; } void freeTable(int **tableau){ free(tableau[0]); free(tableau); }
Pourquoi ?
Voici un tableau du type int tab[5][6]
Un tableau a deux dimensions ça marche comment ? (à pied)
Cela équivaut à créer une premiere dimension (en rouge à gauche), et chaque case de cette première dimension va pointer vers un tableau (vers la première case du tableau) de dimension inférieure. Il est donc possible de faire des tableaux de dimension n > 3.
Merci à ar0x qui m'a fait découvrir cette possibilité :)
Fichier attaché | Taille |
---|---|
![]() | 7.95 Ko |