Libérer la mémoire d'un tableau 2D dynamique [Résolu/Fermé]

Signaler
Messages postés
16
Date d'inscription
dimanche 31 août 2014
Statut
Membre
Dernière intervention
22 février 2016
-
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
-
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

Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 750
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
Messages postés
16
Date d'inscription
dimanche 31 août 2014
Statut
Membre
Dernière intervention
22 février 2016

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...
Messages postés
16
Date d'inscription
dimanche 31 août 2014
Statut
Membre
Dernière intervention
22 février 2016

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!
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 750
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);