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 :

probleme avec free() (erreur de segmentation)


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 15
    Points
    15
    Par défaut probleme avec free() (erreur de segmentation)
    Bonjour, je fais appelle à vous suite à une erreur que je ne comprend pas. Le point positif c'est que je sens qu'en comprenant d'où elle vient, je comprendrai plein de choses!!

    Ce morceau me pose en fait deux problèmes: d'abord, les résultats de addition, division, etc.. ne s'affiche pas correctement lors des printf().
    Ensuite, le programme plante (segfault) lors de l'apparition des free(). Les deux problèmes sont probablement liés!! Les fontion additions, multiplication et soustraction fonctionnent bien lorsque je les test séparement.
    Si quelqu'un a une idée..
    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
     
    int main ( void )
    {
        char const *a = "123456012457984546412354565787987846100123456789629";
        char const *b = "9517534286421972213546";
     
        char* e=NULL;
        char* d=NULL;
        char* c=NULL;
        e=malloc(SZ_MAX*sizeof(char));
        d=malloc(SZ_MAX*sizeof(char));
        c=malloc(SZ_MAX*sizeof(char));
      if(e==NULL || d==NULL || c==NULL)
      {
        printf("failure in memory allocation\n");
        exit(0);
      }
        e=division(a,b);
        printf("%s / %s = %s\n\n", a, b, e);
     
     
        d=multiplication(e,b);
        printf("%s * %s = %s\n\n", e, b, d);
     
     
          c=soustraction(a,d);
        printf("%s - %s = %s\n\n", a,d, c);
        free(e);
        free(d);
        free(c);
        return 0;
    }

  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
    Lorsque tu écris
    tu écrases la valeur renvoyée par le malloc par celle renvoyée par la fonction division(). En aucun cas tu ne fais une copie de ce que calcule division() dans le tableau alloué par le malloc().
    Du coup, le résultat affiché est n'importe quoi et le free() plante puisque e ne vaut plus ce qui a été obtenue par malloc().

    A retenir :
    - on ne peut faire de copie de tableau par =.
    - on ne doit jamais renvoyer l'adresse d'une variable locale, donc en particulier un tableau défini localement à la fonction (puisque dans ce cas, c'est l'adresse du premier élément du tableau qui est renvoyé).
    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
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    D'accord, j'y vois plus clair. Mais en ce cas, comment recuperer la valeur (de type char*) renvoyée par division?

  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
    Deux possibilités :
    1- La fonction division() fait elle-même l'allocation dynamique, place le résultat dans le buffer obtenu et renvoie l'adresse.
    2- La fonction division() prend en argument l'adresse du buffer alloué par la fonction main() pour pouvoir y écrire directement le résultat.
    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: 22
    Dernier message: 19/04/2013, 10h18
  2. Réponses: 5
    Dernier message: 05/12/2006, 14h04
  3. probleme avec l'erreur 3059
    Par el_quincho dans le forum Access
    Réponses: 1
    Dernier message: 07/03/2006, 08h41
  4. probleme avec une erreure!!
    Par d-a-v-e dans le forum C++
    Réponses: 3
    Dernier message: 09/02/2006, 21h15

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