Allouer dynamiquement un tableau à deux dimensions avec uniquement deux malloc

Portrait de trax

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
tab2dim.png7.95 Ko