Erreur malloc/free

Fermé
Aurel_ien - 4 janv. 2013 à 13:40
 Aurel_ien - 4 janv. 2013 à 21:17
Bonjour a tous développer,

Je suis débutant en programmation dans le langage C et j'ai une erreur sur un malloc/free du genre que Xcode me renvoie comme un infos Labyrinthe(35739) malloc: *** error for object 0x7fff950774ad: pointer being freed was not allocated", "Labyrinthe étant le nom de mon projet Xcode.
Je ne comprend pas alors que j'alloue comme il faut je pense mon tableau a deux dimensions.
Voici mon code:

//code sur le fichier main.c
#include <stdio.h>
#include <stdlib.h>
#include "processingLabyrinth.h"

int main(int argc, const char * argv[])
{
    int sizeTableLabyrinthRows = 1, sizeTableLabyrinthColumns = 0, i = 0;
    
    //tableau d'enregistrement du labyrinthe
    int** tableLabyrinth = (int**)malloc(sizeof(int*)*(sizeTableLabyrinthRows));
    
    //phase de traitement du labyrinthe
    processingLabyrinth(tableLabyrinth, &sizeTableLabyrinthRows, &sizeTableLabyrinthColumns);
 
    //......


   for(i=0;i<sizeTableLabyrinthRows;i++){
        printf("#%i", i);
        free(tableLabyrinth[i]);
    }
    free(tableLabyrinth);
    
    return 0;
}



//voici le code de la fonction processingLabyrinth qui se trouve dans un autre fichier
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "processingLabyrinth.h"

//fonction de traitement du labyrinthe
void processingLabyrinth(int** tableLabyrinth, int* sizeTableLabyrinthRows, int* sizeTableLabyrinthColumns){
    int i = 0;

   //je code en dur la taille des lignes et des colonnes
   *sizeTableLabyrinthRows = 10;
   *sizeTableLabyrinthColumns = 10;

    //réallocation du tableau d'enregistrement
    tableLabyrinth = (int**)realloc(tableLabyrinth, sizeof(int*)*(*sizeTableLabyrinthRows));
    
    while(i<*sizeTableLabyrinthRows){
        tableLabyrinth[i] = (int*)malloc( sizeof(int)*(*sizeTableLabyrinthColumns));
        i++;
    }

   //.....
}


Comme vous le voir dans mon main je fait un affichage du type '#i' pour voir quelle ligne n'est pas libéré pour voir ou l'allocation ne se fait pas et mon IDE que c'est a partir de #1 que ce n'est plus alloué.

Pouvez-vous m'aider ?

Merci beaucoup :D

A voir également:

4 réponses

Utilisateur anonyme
4 janv. 2013 à 14:31
Bonjour

Le problème c'est que tu fais un realloc de tableLabyrinth à l'intérieur de processingLabyrinth().
Ceci modifie la variable locale de la fonction, mais pas la variable tableLabyrinth du main.
Donc dans ton main, tableLabyrinth ne correspond plus au tableau alloué. Ça m'étonne même qu'il n'y ait pas d'erreur pour i=0 !

Tu n'as plus qu'à passer tableLabyrinth par adresse.
1
Merci de ta réponse 'le père'.
J'ai une autre question, quand une je passe mon tableau en paramètre dans processingLabyrinth() ce n'est pas déjà un passage par adresse ? Mon prof de C a pas était très clair sur ce point...
0
Utilisateur anonyme
4 janv. 2013 à 15:23
Si tu t'intéresses à la variable tableLabyrinth elle-même (ce qui est le cas), il s'agit bien d'un passage par valeur, puisque dans l'appel à la fonction il n'y a pas l'opérateur &. Tout ce que tu feras à l'intérieur de la fonction ne modifiera pas la variable tableLabyrinth du main.

Par contre, si tu t'intéresses à ce qui est pointé par tableLabyrinth, tu as bien fait un passage par adresse, puisque (bonjour M. de La Palice) tableLabyrinth contient l'adresse de ce qui est pointé par tableLabyrinth. Et tu peux donc, depuis l'intérieur de ta fonction, modifier ce qui est pointé par tableLabyrinth.
1
D'accord je vois.
Je vais faire les modifications et voir si mon programme vas tourner correctement :)

Merci.
0
Eh bien quand je rajoute & pour passer tableLabyrinth, cela ne change rien.. tu peux m'indiquer la syntaxe ?
0
Utilisateur anonyme
4 janv. 2013 à 16:37
Il ne suffit pas de rajouter & dans l'appel. Il faut en tenir compte dans la fonction : tu ne passes plus tableLabyrinth mais son adresse.
Je vais changer le nom du paramètre de la fonction en ptableLabyrinth pour montrer qu'il s'git maintenant d'un pointeur sur tableLabyrinth et non plus de tableLabyrinth elle-même. Attention aux *

void processingLabyrinth(int*** ptableLabyrinth, int* sizeTableLabyrinthRows, int* sizeTableLabyrinthColumns){
    int i = 0;

   //je code en dur la taille des lignes et des colonnes
   *sizeTableLabyrinthRows = 10;
   *sizeTableLabyrinthColumns = 10;

    //réallocation du tableau d'enregistrement
    *ptableLabyrinth = (int**)realloc(*ptableLabyrinth, sizeof(int*)*(*sizeTableLabyrinthRows));
    
    while(i<*sizeTableLabyrinthRows){
        *ptableLabyrinth[i] = (int*)malloc( sizeof(int)*(*sizeTableLabyrinthColumns));
        i++;
    }


En espérant que je ne me suis pas trompé.
Au fait, à quoi sert ton initialisation de tableLabyrinth dans main ?
1
J'ai essayé ce que tu as fait mais cela ne change rien du tout a l'erreur :/

J'initialise tableLabyrinth dans le main car j'en ai besoin dans d'autres fonctions :)
0
Utilisateur anonyme
4 janv. 2013 à 18:10
Je viens de faire l'essai et je me suis rendu compte que j'ai oublié des parenthèses dans ma modification :
(*ptableLabyrinth)[i] = (int*)malloc...

Je ne sais pas comment tu as fait, chez moi sans ces parenthèses c'est une erreur d'exécution à l'allocation...
Sinon chez moi ça marche, ça marchait même avec ta version initiale, sûrement parce que le realloc n'a pas déplacé physiquement les données.

Je suppose que le code qui est derrière les //... est toujours présent : peux-tu le mettre réellement en commentaire pour n'exécuter que ce que tu as montré et voir si tu as toujours le problème ?
1
Effectivement l'erreur venait bien de là. Je te remercie beaucoup pour ton aide et tes explications cela m'as été très utile !! :D

J'aurais juste une dernière question, professionnellement parlant un pointeur sur un pointeur sur un pointeur, c'est "dans les normes" et viable ?
0
Utilisateur anonyme
4 janv. 2013 à 21:13
Je n'en sais rien, je ne suis pas professionnel et je n'ai que de vagues souvenirs du C (d'où mon oubli des parenthèses). Mais j'ai une idée claire de ce qu'est un pointeur, et ça ne me gêne pas de parler d"un pointeur sur un pointeur sur un pointeur, quitte à faire un petit dessin (ce que j'ai vraiment fait) pour visualiser ce dont j'ai besoin ou ce dont on parle.
0
D'accord,
Merci beaucoup :D
0