IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[realloc] glibc detected ./bin/Test: corrupted double-linked list


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut [realloc] glibc detected ./bin/Test: corrupted double-linked list
    Bonjour,
    Dans un programme, la fonctionne realloc plante si je demande de réallouer a partir d'une certaine valeur, il doit y avoir probablement un free a faire mais je ne vois pas ou.

    voici ma fonction pour réallouer une chaine de taille cpt_chaine à une nouvelle taille de la valeur indice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int reallocation_chaine(char **chaine, int *cpt_chaine, int indice){
      char *temp;
      *cpt_chaine=indice;
      temp=realloc(*chaine,*cpt_chaine);
      if(temp!=NULL)
        *chaine=temp;
      else
        return-1;
      return 0;
    }
    cette fonction est utilisé dans un fonction qui parcourt un fichier afin de créer une chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    int creer_chaine(char **chaine,int *cpt_chaine,FILE *fichier, char *caractere, char fin){
     
      char *temp=*chaine;
      FILE *file=fichier;
      int cpt_c=*cpt_chaine;
     
      int cpt=0;
      while(*caractere!=fin && *caractere!=EOF){
        printf(" %d tour\n",cpt);
        if(cpt+2>cpt_c){
          if(reallocation_chaine(&temp,&cpt_c,cpt_c*2)==-1){
    	return -1;	
    	}
        }
        temp[cpt]=*caractere;
        *caractere=fgetc(file);
        cpt++;
      }
      *cpt_chaine=cpt+1;
      if(reallocation_chaine(&temp,&cpt,cpt+1)==-1)
        return -1;
      temp[cpt-1]='\0'; 
      *chaine=temp;
      *caractere=fgetc(file);
      return 0;
    }
    Merci pour votre aide!

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int reallocation_chaine(char **chaine, int *cpt_chaine, int indice){
      char *temp=*chaine;
    ....
      if(realloc(temp,(*cpt_chaine)*sizeof(char))!=NULL)
        *chaine=temp;
    1- A l'entrée de la fonction, *chaine doit être NULL ou une valeur obtenue par --alloc(). La partie de code montrée ne permet pas de répondre.

    2- Par contre, la méthode de réallocation est fausse : La réallocation par realloc peut modifier la position mémoire du bloc alloué. Dans ce cas, realloc renvoie la nouvelle adresse (!=NULL) et la zone mémoire antérieurement utilisée est automatiquement libérée. Dans ce cas, l'allocation de temp à *chaine stockera une valeur devenue illégale. La fonction plantera à l'appel suivant.

    Il faut suivre le schéma suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    temp =  realloc(*chaine,*cpt_chaine);
    if(temp!=NULL) *chaine = temp;
    else return -1; // *chaine n'est pas modifié
    return 0;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Merci pour la réponse,
    J'ai modifié ma fonction reallocation_chaine mais le probleme est toujours le meme. Et à l'entrée de ma fonction, c'est bien une chaine alloué grace a malloc.

    [edit]En mettant des commentaires pour tester ou a lieu l'erreur, un avant le realloc et un apres, j'en deduis que c'est lors du realloc que j'ai un souci, a savoir que la fonction est appelée plein de fois en boucle[/edit]

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    En mettant des commentaires pour tester ou a lieu l'erreur, un avant le realloc et un apres, j'en deduis que c'est lors du realloc que j'ai un souci, a savoir que la fonction est appelée plein de fois en boucle
    Comme il n'y a pas de boucles dans reallocation_chaine, j'en déduis qu'il faut voir le problème dans les fonctions appelant reallocation_chaine. creer_chaine ? Mais on ne connait pas les paramètres d'appel à cette fonction !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Par défaut
    Dans ma fonction main, j'ai déclaré ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *parametre; 
    int parametre_cpt; // entier qui retient la taille allouée
    FILE *fichier; //un fichier que j'ouvre et dont je vais parcourir chaque caractere
    char caractere; // le caractere courant
    que j'ai alloué comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    parametre=malloc(10*sizeof(char));
    if(parametre==NULL)
        return -1;
    parametre_cpt=10;
    et j'appelle ma fonction créer_chaine comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(creer_chaine(&parametre,&parametre_cpt,fichier,&caractere,']')==-1)
    return -1;

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //parametre est donc alloué pour 10 char dans main. zone initialisée ?-|
    //Dans creer_chaine                                                    |
    cpt_strlen=strlen(temp);  //                                           | 
    //qui a mis une chaîne de caractères dans parametre ?           <-------

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/05/2019, 17h27
  2. [2D/3D] QGLWidget et "corrupted double-linked list error"
    Par fab13 dans le forum Qt
    Réponses: 2
    Dernier message: 26/11/2012, 21h50
  3. [ProFTPd][glibc detected double free or corruption]
    Par Théolude dans le forum Administration système
    Réponses: 1
    Dernier message: 28/08/2008, 09h19
  4. erreur glibc detected double free or corruption.
    Par Screwt-K dans le forum C++
    Réponses: 1
    Dernier message: 02/07/2007, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo