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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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;
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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 !
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    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 éminent sénior
    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
    Points : 13 926
    Points
    13 926
    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 ?           <-------
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    cpt_strlen=strlen(temp); ---> c'est une erreur de recopie, car j'ai rajouté plein de variables et test pour savoir ou mon code bugguait.

    Par contre, je ne comprends pas
    parametre est donc alloué pour 10 char dans main. zone initialisée ?
    La zone initialisée ne serait elle pas pointée par paramètre?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qui a mis une chaîne de caractères dans parametre ?
    c'est moi qui est initialisé paramètre au début de mon main, je ne sais pas si je dois poster mon main car il est un peu lourd... ou alors je peux essayer de donner ou version un peu abrégé pour expliquer ce que je tente de faire.

    EDIT: effectivement la zone n'est pas initialisée, j'avais mal compris, tant que je ne touche pas à parametre les caracteres sont carréments aléatoires mais cela a t-il une conséquence sur le realloc?

    EDIT2: en faisant d'autres test, je me rends compte que le probleme a lieu dès que je demande d'allouer trop de mémoire pour parametre (trop n'est pas beaucoup peut etre une vingtaine de caractere....), par contre des que l'allocation doit etre plus petite, il n'y a aucun probleme...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    A priori, le probleme semblerait venir d'ailleurs...
    Voici une partie de mon main

    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
     
    char *parametre;
    int parametre_cpt;
    char *temp;
     
    parametre=malloc(10*sizeof(char));
    if(parametre==NULL)
      return -1;
    parametre_cpt=10;
     
    temp=realloc(parametre,1000);
    if(temp!=NULL)
       parametre=temp;
    else
      return -1;
    parametre_cpt=1000;
    Et boum, ca plante...

    EDIT: bon je dis des bétises... si j'essaye ce code tout seul ca plante pas, ca doit encore etre ailleurs alors.

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu as mis à jour le code de creer_chaine dans ton post #1 mais pas celui de reallocation_chaine. Peux-tu montrer les modifications que tu as apportées ?

    Il faudrait aussi voir le code appelant tout ça (main ?), sinon c'est difficile de dire quelque chose.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Il faut que je mette tout a jour dans le post 1 ? ----> ok
    J'avais juste modifié une erreur qui ne devait pas etre présente
    Bon je poste tout mon code :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
     
     
    /*ajoute un tag dasn le tableau des tags, les parametres saisis etant directement les cases du tableau*/
    int ajouter_tag(char **tags, int tags_cpt, int *tags_chaine_malloc, char *parametre, int parametre_cpt){
      char *chaine;
      chaine = realloc(*tags,parametre_cpt*sizeof(char));
      *tags_chaine_malloc=parametre_cpt;
      if(chaine!=NULL){
        strcpy(chaine,parametre);
        *tags=chaine;
      }
      else
        return -1;
      return 0;
    }
     
    /*réalloue une chaine de taille cpt_chaine à une nouvelle taille indice*/
    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;
    }
     
    /*realloue un tableau de chaine "tags" de taille *tags_cpt_malloc en ajoutant +2, tags_chaine_malloc est aussi mis a jour car il contient la taille de chacune des chaines*/
    int reallocation_tags(char ***tags, int *tags_cpt_malloc,int **tags_chaine_malloc){
     
      char **temp;
      int *temp_chaine;
      int i;
     
      temp=realloc(*tags,*tags_cpt_malloc+2); //tableau tags
      if(temp==NULL)
        return -1;
      *tags=temp;
      temp_chaine=realloc(*tags_chaine_malloc,*tags_cpt_malloc+2); //tableau avec les tailles des tags
      if(temp_chaine==NULL)
        return -1;
      *tags_chaine_malloc=temp_chaine;
      *tags_cpt_malloc+=2;
      for(i=*tags_cpt_malloc-2;i<*tags_cpt_malloc;i++){ //initialisation des nouvelles cases des 2 tableaux
        *tags[i]=malloc(10*sizeof(char));
        if(*tags[i]==NULL)
          return -1;
        *tags_chaine_malloc[i]=10;
      }
      return 0;
    }
     
    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){
        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;
     
    }
     
    /*méthode identique a creer_chaine sauf qu'il y a 2 caracteres de fin possibles*/
    int creer_chaine2(char **chaine,int *cpt_chaine,FILE *fichier, char *caractere, char fin, char fin2){
     
      char *temp=*chaine;
      FILE *file=fichier;
      int cpt_c=*cpt_chaine;
      int cpt=0;
      while(*caractere!=fin && *caractere!=fin2 && *caractere!=EOF){
        if(cpt+1>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;
      return 0;
    }
     
    /*unite est une structure prenant différents parametre mais non utilisés pour l'instant ...donc inutile*/
    int unite_init(unite *this,FILE *fichier){
     
      char caractere;
      int valide;
      int i;
     
      char *parametre;
      int parametre_cpt;
     
      char *valeur;
      int valeur_cpt;
     
      char ** tags;/*tab de tags*/
      int tags_cpt;/*,nombre de tags*/ 
      int tags_cpt_malloc;/*nombre de tags alloués*/
      int *tags_chaine_malloc;/*taille de chaque case alloué de tag*/
     
      /*Init*/
     
      caractere=fgetc(fichier);
      valide=1;
      tags_cpt=0;
     
      parametre=malloc(10*sizeof(char));
      if(parametre==NULL)
        return -1;
      parametre_cpt=10;
     
      valeur=malloc(100*sizeof(char));
      if(valeur==NULL)
        return -1;
      valeur_cpt=100;
     
      tags=malloc(20*sizeof(char));
      if(tags==NULL)
        return -1;
      tags_cpt_malloc=20;
     
      tags_chaine_malloc=malloc(20*sizeof(int));
      if(tags_chaine_malloc==NULL)
        return -1;
     
      for(i=0;i<20;i++){
        tags_chaine_malloc[i]=10;
        tags[i]=malloc(10*sizeof(char));
        if(tags[i]==NULL)
          return -1;
      }
     
      /*Premier tag : c'est pour enlever des conditions et arriver directement au premier caractere '['*/
     
      while(caractere!='[')
        caractere=fgetc(fichier);
     
      /*Principal : soit on ajoute(enleve) un tag, soit un parametre, soit on passe des caractere*/
     
      while(caractere!=EOF && valide){
        if(caractere=='\t' || caractere==' ' || caractere=='\n')
          caractere=fgetc(fichier);
        else if(caractere=='#' || caractere=='{'){/*cas non traités*/
          while(caractere!='}' &&  caractere!='\n')
    	caractere=fgetc(fichier);
        }
        else if(caractere=='['){/*on va ajouter on enlever un tag*/
          caractere=fgetc(fichier);
          if(caractere=='/'){/*on enleve*/
    	caractere=fgetc(fichier);
    	if(creer_chaine(&parametre,&parametre_cpt,fichier,&caractere,']')==-1)
    	  return -1;
    	if(strcmp(parametre,tags[tags_cpt-1])==0)/*on verifie que le tag correspond bien au tag actuel*/
    	  tags_cpt--;
          }
          else{/*on va créer un tag et réallouer si nécéssaire*/
    	tags_cpt++;
    	  if(creer_chaine(&parametre,&parametre_cpt,fichier,&caractere,']')==-1)
    	    return -1;
    	  if(tags_cpt>tags_cpt_malloc){
    	    reallocation_tags(&tags,&tags_cpt_malloc,&tags_chaine_malloc);
    	  }
    	  if(ajouter_tag(&tags[tags_cpt-1],tags_cpt,&tags_chaine_malloc[tags_cpt-1],parametre,parametre_cpt)==-1)
    	    return -1;
          }
        }
        else{/*cas a terminer ... mais non nécéssaire pour l'instant*/
          if(creer_chaine(&valeur,&valeur_cpt,fichier,&caractere,'\n')==-1)
    	return -1;
        }
        if(tags_cpt==0)
          valide=0;
      }
      return 0;
    }

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Bonsoir,
    Je n'avais jamais utilisé de debuggueur et j'ai voulu essayer gdb,
    j'obtiens ceci :
    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
     
    Program received signal SIGABRT, Aborted.
    0x00007f1ded3973c5 in raise () from /lib/libc.so.6
    (gdb) bt
    #0  0x00007f1ded3973c5 in raise () from /lib/libc.so.6
    #1  0x00007f1ded39873e in abort () from /lib/libc.so.6
    #2  0x00007f1ded3ce8e7 in ?? () from /lib/libc.so.6
    #3  0x00007f1ded3d3aad in ?? () from /lib/libc.so.6
    #4  0x00007f1ded3d6e32 in ?? () from /lib/libc.so.6
    #5  0x00007f1ded3d7871 in realloc () from /lib/libc.so.6
    #6  0x00000000004016a3 in ajouter_tag (tags=0x604290, tags_cpt=1,
        tags_chaine_malloc=0x634280, parametre=0x604200 "unit", parametre_cpt=5)
        at unite.c:25
    #7  0x0000000000401d84 in unite_init (this=0x604180, fichier=0x634040)
        at unite.c:203
    #8  0x0000000000401668 in new_unite (fichier=0x634040) at unite.c:16
    #9  0x0000000000402121 in main () at main.c:75
    C'est donc realloc dans ajouter_tag qui plante... mais pourquoi?

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Bonjour,
    Mon probleme est résolu, cependant, je pense avoir triché....
    et que j'ai fait des trucs qu'il ne faut pas.
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int ajouter_tag(char **tags, int tags_cpt, int *tags_chaine_malloc, char *parametre, int parametre_cpt){
    char *chaine;
    chaine = malloc(parametre_cpt*sizeof(char));
    if(chaine==NULL)
      return -1;
    strcpy(chaine,parametre);
    *tags_chaine_malloc=parametre_cpt;
    *tags=chaine;
    return 0;
    ou encore

    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
     
    int reallocation_chaine(char **chaine, int *cpt_chaine, int indice){
      char *temp;
      int i;
     
      char *t;
      char *c=*chaine;
     
      temp=malloc(indice*sizeof(char));
      t=temp;
      if(temp!=NULL){
        for(i=0;i<*cpt_chaine;i++){
          *t=*c;
          t++;
          c++;
        }
        *cpt_chaine=indice;
        *chaine=temp;
      }
      else
        return-1;
      return 0;
    }
    Dans ces deux cas, que se passe t'il de la memoire initialement allouée à tags et chaine?
    Le systeme la recupere t-il ?
    Est_elle perdue? Dans ce cas ou dois-je faire un free sans qu'il y ait de plantage à l'execution?
    Merci d'avance pour les réponses,

  13. #13
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Dans ces deux cas, que se passe t'il de la memoire initialement allouée à tags et chaine?
    Le systeme la recupere t-il ?
    Rien n'est récupéré, tant qu'on n'a pas fait un free.
    Si le realloc change l'adresse du bloc alloué, après avoir recopié les valeurs de l'ancien bloc vers le nouveau, l'ancien bloc est automatiquement libéré.
    Dans ce cas ou dois-je faire un free sans qu'il y ait de plantage à l'execution?
    Lorsque tu n'as plus besoin des données contenues dans le tableau alloué.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  14. #14
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    D'après le diagnostic de gdb, dans ta fonction ajouter_tag utilisant realloc, il faudrait vérifier que l'argument tags à l'appel est correct : *tags, à l'entrée de la fonction doit être une adresse allouée par une fonction malloc, realloc,... ou NULL. (peut-être cette valeur n'a t'elle pas été initialisée ?)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup pour ton aide,
    mon probleme semble résolu,
    juste une petite question : que signifie
    (peut-être cette valeur n'a t'elle pas été initialisée ?)
    Parce qu'un malloc alloue de la mémoire mais ne l'initialise pas...,
    donc dans ce cas initialiser voudrait dire attribuer une valeur à la variable allouée par malloc?

  16. #16
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Amroth Voir le message
    Merci beaucoup pour ton aide,
    mon probleme semble résolu,
    juste une petite question : que signifie

    Parce qu'un malloc alloue de la mémoire mais ne l'initialise pas...,
    donc dans ce cas initialiser voudrait dire attribuer une valeur à la variable allouée par malloc?
    Non, je voulais dire que *tags pouvait n'être pas initialisé lors du premier appel à la fonction (c'est à dire être une adresse retournée par malloc,... ou NULL)
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int ajouter_tag(char **tags, int tags_cpt, int *tags_chaine_malloc, char *parametre, int parametre_cpt){
      char *chaine;
      chaine = realloc(*tags,parametre_cpt*sizeof(char));
    ....
     
    char * Tags; // Non initialisé
    ajouter_tag(&Tags,....);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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