Désallocation structure
rct1234fanBE
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous (et éventuellement à toutes ;) ).
Voilà, je dois faire un projet pour lequel j'ai un structure implémentée comme un type opaque que j'arrive à allouer mais pas à dés-allouer ... Je vous explique le problème.
Ma structure est la suivante :
struct Piece{
int longueur; /*!< Longueur de la pièce, caractère '\0' non compté */
int hauteur; /*!< Hauteur de la pièce, caractère '\0' non compté */
char **represent_piece; /*!< Représentation graphique de la pièce */
};
J'alloue la mémoire nécessaire pour un tableau de 6 pièces avec cette fonction (sans les free) :
Piece *cree_tableau_pieces(){
Piece *p;
int i, j, hauteur, longueur;
//ETAPE 1 : On alloue 6 fois la structure [tab. de structure] car j'ai 6 pièces au total.
p=malloc(6*sizeof(Piece));
if(p==NULL)
return NULL;
//ETAPE 2 : Pour chaque cellule du tableau, on alloue le tableau de caractères
for(i=0; i<6 ;i++){
//Etape 2.1 : Chaque pièce possède une longueur et largeur différente (cfr. ReadMe pour la taille des pièces) !
if(i==3 || i==4 || i==5){
hauteur=2;
longueur=3;
}
if(i==0 || i==1){
hauteur=3;
longueur=2;
}
if(i==2){
hauteur=4;
longueur=1;
}
//Etape 2.2 : On alloue les lignes
p[i].represent_piece=malloc(hauteur*sizeof(char *));
if(p[i].represent_piece==NULL){
printf("Erreur lors de l'allocation des pièces\n");
exit(1);
}//fin du if
//Etape 2.3 : On alloue les colonnes
for(j=0; j<hauteur+1 ;j++){
p[i].represent_piece[j]=malloc((longueur+1)*sizeof(char));
if(p[i].represent_piece[j]==NULL){
printf("Erreur lors de l'allocation des pièces\n");
exit(1);
}
}//fin du for
//ETAPE 3 : On attribue la hauteur et la longueur à p[i]
p[i].hauteur=hauteur;
p[i].longueur=longueur;
}// fin du 'for' qui parcours toutes les cellules de 'p'
//ETAPE 4 : On complète les chaînes de caractère de chacunes des pièces
//Etape 4.1 : pièce 0
p[0].represent_piece[0]="# ";
p[0].represent_piece[1]="# ";
p[0].represent_piece[2]="##";
//Etape 4.2 : pièce 1
p[1].represent_piece[0]=" #";
p[1].represent_piece[1]=" #";
p[1].represent_piece[2]="##";
//Etape 4.3 : pièce 2
p[2].represent_piece[0]="#";
p[2].represent_piece[1]="#";
p[2].represent_piece[2]="#";
p[2].represent_piece[3]="#";
//Etape 4.4 : pièce 3
p[3].represent_piece[0]="# ";
p[3].represent_piece[1]="###";
//Etape 4.5 : pièce 4
p[4].represent_piece[0]=" # ";
p[4].represent_piece[1]="###";
//Etape 4.6 : pièce 5
p[5].represent_piece[0]=" # ";
p[5].represent_piece[1]="###";
return p; //On renvoie le pointeur sur Piece
}// Fin de la fonction cree_tableau_pieces
L'allocation se déroule bien, il y a bien sur des fuites mémoire lorsque p[i]. ... =NULL vu que je n'ai pas mis les free !
Venons en à la dés-allocation.
Pour désallouer le tableau de caractères de ces pièces, il m'a semblé logique d'utiliser cette fonction :
http://hpics.li/1d086a0
Mais j'obtiens cette grosse erreur-ci :
http://www.hostingpics.net/viewer.php?id=836887Capturedu20140312182539.png
Pourtant je passe bien à free un pointeur sur char ! :'( help please.
Voilà, je dois faire un projet pour lequel j'ai un structure implémentée comme un type opaque que j'arrive à allouer mais pas à dés-allouer ... Je vous explique le problème.
Ma structure est la suivante :
struct Piece{
int longueur; /*!< Longueur de la pièce, caractère '\0' non compté */
int hauteur; /*!< Hauteur de la pièce, caractère '\0' non compté */
char **represent_piece; /*!< Représentation graphique de la pièce */
};
J'alloue la mémoire nécessaire pour un tableau de 6 pièces avec cette fonction (sans les free) :
Piece *cree_tableau_pieces(){
Piece *p;
int i, j, hauteur, longueur;
//ETAPE 1 : On alloue 6 fois la structure [tab. de structure] car j'ai 6 pièces au total.
p=malloc(6*sizeof(Piece));
if(p==NULL)
return NULL;
//ETAPE 2 : Pour chaque cellule du tableau, on alloue le tableau de caractères
for(i=0; i<6 ;i++){
//Etape 2.1 : Chaque pièce possède une longueur et largeur différente (cfr. ReadMe pour la taille des pièces) !
if(i==3 || i==4 || i==5){
hauteur=2;
longueur=3;
}
if(i==0 || i==1){
hauteur=3;
longueur=2;
}
if(i==2){
hauteur=4;
longueur=1;
}
//Etape 2.2 : On alloue les lignes
p[i].represent_piece=malloc(hauteur*sizeof(char *));
if(p[i].represent_piece==NULL){
printf("Erreur lors de l'allocation des pièces\n");
exit(1);
}//fin du if
//Etape 2.3 : On alloue les colonnes
for(j=0; j<hauteur+1 ;j++){
p[i].represent_piece[j]=malloc((longueur+1)*sizeof(char));
if(p[i].represent_piece[j]==NULL){
printf("Erreur lors de l'allocation des pièces\n");
exit(1);
}
}//fin du for
//ETAPE 3 : On attribue la hauteur et la longueur à p[i]
p[i].hauteur=hauteur;
p[i].longueur=longueur;
}// fin du 'for' qui parcours toutes les cellules de 'p'
//ETAPE 4 : On complète les chaînes de caractère de chacunes des pièces
//Etape 4.1 : pièce 0
p[0].represent_piece[0]="# ";
p[0].represent_piece[1]="# ";
p[0].represent_piece[2]="##";
//Etape 4.2 : pièce 1
p[1].represent_piece[0]=" #";
p[1].represent_piece[1]=" #";
p[1].represent_piece[2]="##";
//Etape 4.3 : pièce 2
p[2].represent_piece[0]="#";
p[2].represent_piece[1]="#";
p[2].represent_piece[2]="#";
p[2].represent_piece[3]="#";
//Etape 4.4 : pièce 3
p[3].represent_piece[0]="# ";
p[3].represent_piece[1]="###";
//Etape 4.5 : pièce 4
p[4].represent_piece[0]=" # ";
p[4].represent_piece[1]="###";
//Etape 4.6 : pièce 5
p[5].represent_piece[0]=" # ";
p[5].represent_piece[1]="###";
return p; //On renvoie le pointeur sur Piece
}// Fin de la fonction cree_tableau_pieces
L'allocation se déroule bien, il y a bien sur des fuites mémoire lorsque p[i]. ... =NULL vu que je n'ai pas mis les free !
Venons en à la dés-allocation.
Pour désallouer le tableau de caractères de ces pièces, il m'a semblé logique d'utiliser cette fonction :
http://hpics.li/1d086a0
Mais j'obtiens cette grosse erreur-ci :
http://www.hostingpics.net/viewer.php?id=836887Capturedu20140312182539.png
Pourtant je passe bien à free un pointeur sur char ! :'( help please.
A voir également:
- Désallocation structure
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Structure url - Guide
- Trouvez l'erreur dans la structure du document et corrigez-la. - Forum Word
- Error pdf structure 40 - Forum PDF
1 réponse
Il y a des fuites mémoires même p[i]...!=NULL.
L'erreur vient des affectations.
p[4].represent_piece[0]=" # ";
Fuite mémoire. Il faut utiliser strcpy(p[4].represent_piece[0]," # "); (et pareil pour les autres).
Pour les free() je n'ai pas regardé ce que tu as fait. Mais il suffit de faire les malloc() en sens inverse.
L'erreur vient des affectations.
p[4].represent_piece[0]=" # ";
Fuite mémoire. Il faut utiliser strcpy(p[4].represent_piece[0]," # "); (et pareil pour les autres).
Pour les free() je n'ai pas regardé ce que tu as fait. Mais il suffit de faire les malloc() en sens inverse.