Allouer et libérer un tableau 2D en C en utilisant void

L’idée est d’utiliser uniquement deux fonctions qui peuvent à la fois allouer et libérer un tableau 2D d’un type de données donné qui n’est pas connu au moment de la compilation. Le code que j’ai écrit se bloque dans la fonction de libération, mais je ne vois pas pourquoi. Voici le code:

void** new2DArray(int row, int col, int typeSize){ void** temp = malloc(sizeof(void*)*row); //EDIT for (row-=1; row >= 0; row--) temp[row] = malloc(typeSize*col); return temp; } void free2DArray(void** array, int row, int typeSize){ for (row -= 1; row >= 0; row--) free( *(array + row*typeSize) ); free(array); } 

Où, pour un tableau 3×3, est appelé ainsi:

 double** test = (double**) new2DArray(3, 3, sizeof(double)); free2DArray(test, 3, sizeof(double)); 

Y a-t-il un problème immédiat avec la fonction de libération?

Le free2DArray semble faux. Vous n’avez pas besoin de connaître la taille des types; vous venez de libérer les blocs que vous avez alloués:

 void free2DArray(void** array, int row){ for (row -= 1; row >= 0; row--) free( array[row] ); free(array); } 

Pourquoi ne pas le libérer de la même manière que vous l’allouez?

 for (row-=1; row >= 0; row--) free(array[row]); //free(*(array + row)); <- or the way you are doing it free(array); 

Vous libérez des tableaux de colonnes avec free(*(array + row*typeSize)); . Cependant, il devrait être free(*(array + row)) ou, plus précisément, free(array[row]) . array + row*typeSize vous oblige à ignorer le typeSize nombre de vecteurs de colonne par itération, et donc les colonnes “libres” qui n’ont jamais été allouées.