Libérer la mémoire d'un tableau 2D dynamique

Résolu/Fermé
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016 - 26 janv. 2015 à 16:48
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 janv. 2015 à 21:23
Bonjour,

J'aimerais pouvoir libérer la mémoire des tableaux 2D alloués dynamiquement dans mon programme à l'aide d'une fonction qui elle renfermera le "free". Le problème est que l'adresse de mon tableau ne semble pas être passée en paramètre et j'ai des erreurs de violation d'accès :-(

Voici mon code:

int main(void)
{
...

int** GrilleDeJeu=NULL;

CreerGrilleJeu(GrilleDeJeu,Largeur,Hauteur);

LibereMemoire(GrilleDeJeu,Largeur);

system ("pause");

return EXIT_SUCCESS;
}

void CreerGrilleJeu(int** GrilleDeJeu, int Largeur, int Hauteur)
{
//Variables d'itération
int i;
int j;

// Alloue le tableau de pointeurs d'entier
GrilleDeJeu = (int**) malloc(sizeof(int*) * (Largeur));

// Alloue chacun des espaces contigus du tableau d'entier
for (i = 0; i < Largeur; i++)
{
GrilleDeJeu[i] = (int*) malloc(sizeof(int) * (Hauteur));
}
}

void LibereMemoire(int** GrilleDeJeu, int Largeur)
{
//Variable d'itération
int i;

// Libere l'espace mémoire des entiers
for (i = 0; i < Largeur; i++)
{
free(GrilleDeJeu[i]);
}

//Libère l'espace mémoire des pointeurs d'entier
free(GrilleDeJeu);

// Met le pointeur à nul
GrilleDeJeu = NULL;
}

Quelqu'un peut m'aider?

1 réponse

fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
26 janv. 2015 à 19:35
Bonjour,
La fonction de création de la grille est fausse.
Il faut passer par un pointeur. Donc ici ça sera un triple pointeur.
Note : les casts pour les malloc sont inutiles.

Cdlt
0
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016
Modifié par kevdaig le 26/01/2015 à 20:30
Bonjour,

J'ai fait les modifs, je n'ai plus de problème pour remplir mon tableau mais je n'arrive toujours pas à libérer la mémoire avec le free...
0
kevdaig Messages postés 16 Date d'inscription dimanche 31 août 2014 Statut Membre Dernière intervention 22 février 2016
26 janv. 2015 à 20:32
Finalement, j'ai compris mon erreur. Je ne passais pas réellement le tableau 2D en paramètre mais plutôt son adresse. Maintenant ça fonctionne! Je crois que, comme vous avez dit, tout était de la faute de la fonction de création de la grille.

Merci encore!
0
fiddy Messages postés 11067 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 812
26 janv. 2015 à 21:23
Exactement.
Il faut passer par void CreerGrilleJeu(int*** GrilleDeJeu, int Largeur, int Hauteur)
Lors de l'appel : CreerGrilleJeu(&GrilleDeJeu, ...);
Et dans la fonction CreeGrilleJeu, il te suffit de remplacer GrilleDeJeu par (*GrilleDeJeu).
Note : sinon, tu peux passer par : char **CreerGrilleJeu(int Largeur, int Hauteur);
0