void **malloc2d (unsigned int num, unsigned int size)
{
char **c, **d, *p;
if(!num || !size) return 0; //<- à retirer dans un code sûr
if(!(c = (char**)malloc((num*size)+(num*sizeof(char*))))) return 0;
d = c; p = (char*)(c+num);
do *d++ = p+(--num*size); while(num);
// OU
// do *(d+(--num)) = p+(num*size); while(num);
return (void**)c;
}
Remarque :
num = nombre de pointeurs
size = taille de chaque zone mémoire pointé par chaque pointeur
Les pointeurs pointerons de la zone la plus élevé vers la plus basse: dison qu'il y a 4 pointeurs donc 4 zones. Le pointeur 1 pointera sur la zone 4, le pointeur 2 sur la zone 3 et ansi de suite.
Sinon, il y a l'autre méthode mit en commentaire qui fera pointer le premier pointeur sur la première zone, le second sur la seconde zone etc.
J'ai noté des performances très légèrement meilleur avec la première méthode.
Pour libérer TOUTE la mémoire, un simple free suffit.