Erreur malloc/free
Aurel_ien
-
Aurel_ien -
Aurel_ien -
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
//voici le code de la fonction processingLabyrinth qui se trouve dans un autre fichier
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
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:
- Erreur malloc/free
- Word 2013 free download - Télécharger - Traitement de texte
- Zimbra free - Guide
- Free office - Télécharger - Suite bureautique
- Sketchup free - Télécharger - 3D
- Mode sécurisé free - Forum LG
4 réponses
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.
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.
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.
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.
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 *
En espérant que je ne me suis pas trompé.
Au fait, à quoi sert ton initialisation de tableLabyrinth dans main ?
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 ?
Je viens de faire l'essai et je me suis rendu compte que j'ai oublié des parenthèses dans ma modification :
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 ?
(*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 ?
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.
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...