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 :

pb de malloc


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut pb de malloc
    Bonjour, j'ai un pb de malloc. Voici tout d'abord ce que j'ai fait :

    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
     
    typedef struct t_mat
    {
        int dim;
        double * data;
    } Tableau;
     
     
    void alloc_Tableau(Tableau *t,unsigned int dim_)
    {
        assert(dim_>0);
        t->dim=dim_;
        t->data=malloc(dim_*sizeof(double));
        assert(t->data!=NULL);
        int i;
        for(i=0;i<t->dim;i++)
    	t->data[i]=0.;
        return ;
    }
     
    void free_Tableau(Tableau * t)
    {
        free(t->data);
        t->data=NULL;
        return ;
    }
     
    void affiche_Tableau(Tableau t)
    {
        if(t.data==NULL)
    	printf("\nTableau inexistant\n");
        else
        {
    	int i;
    	for(i=0;i<t.dim;i++)
    	    printf("%3.5g\t",t.data[i]);
    	printf("\n");
        }
     
        return;
    }
    Dans le main je fais la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tableau t1;
    alloc_Tableau(&t1,3);
    affiche_Tableau(t1);
    free_Tableau(&t1);
    et là j'obtiens bien la sortie

    Maintenant si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Tableau * t2
    alloc_Tableau(t2,3);
    et bien j'ai une erreur de segmentation. Savez-vous pourquoi ?

    Merci beaucoup.

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut Re: pb de malloc
    bien le bonjour,
    Citation Envoyé par salseropom
    [...]
    Maintenant si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Tableau * t2
    alloc_Tableau(t2,3);
    et bien j'ai une erreur de segmentation. Savez-vous pourquoi ?
    tu dois allouer de la memoire pour y stocker ton 'Tableau'.
    il te manque un t2 = malloc ...
    sinon, tu ecris dans un emplacement non alloue.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut khayyam90,

    il te manque un t2 = malloc ...
    mais c'est ce que je fais dans ma fonction alloc_Tableau (enfin c'est ce que je voudrais faire). Où est donc l'erreur dans ma fonction car visiblement elle marche pour un Tableau t1 mais pas pour un Tableau * t2

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    il te manque un t2 = malloc ...
    mais c'est ce que je fais dans ma fonction alloc_Tableau (enfin c'est ce que je voudrais faire). Où est donc l'erreur dans ma fonction car visiblement elle marche pour un Tableau t1 mais pas pour un Tableau * t2
    • Passer une valeur indéfinie à une fonction invoque un comportement indéfini. C'est un bug.
    • Modifier un paramètre dans une fonction est souvent un erreur de conception. La valeur initiale (de l'appelant) restera inchangée.

    Autrement dit, ta démarche est erronée.

    Si tu veux qu'une fonction crée une variable, le plus simple est de faire comme malloc() : retourner l'adresse de la variable créée.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Citation Envoyé par salseropom
    mais c'est ce que je fais dans ma fonction alloc_Tableau (enfin c'est ce que je voudrais faire)
    non, dans ta fonction alloc_Tableau tu alloues de la memoire pour t->data, encore faudrait-il que t->data soit defini, ce qui n'est pas le cas si tu prends un Tableau * t2 .

  6. #6
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut
    mais c'est ce que je fais dans ma fonction alloc_Tableau (enfin c'est ce que je voudrais faire). Où est donc l'erreur dans ma fonction car visiblement elle marche pour un Tableau t1 mais pas pour un Tableau * t2
    Non ta fonction alloue l'espace du "tableau" de double défini dans ta structure.
    La tu crées un pointeur vers ta structure. Il faut donc l'allouer pour ensuite appeler ta fonction qui feras l'allocation du tableau.

    C'est pas très clair hein ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Re-bonjour, merci à vous, j'ai compris !

    Voici donc ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Tableau t1;
        alloc_Tableau(&t1,3);
        affiche_Tableau(t1);
    free_Tableau(&t1);
     
        Tableau * t2;
        t2=malloc(sizeof(Tableau));
        alloc_Tableau(t5,4);
        affiche_Tableau(*t5);
        free_Tableau(t5);
    Une dernière question : est-ce que mon t5 est bien effacé de la mémoire ou est-ce seulement le t5->data qui est effacé ?
    Ai-je une fuite de mémoire à la fin de mon prgm (avec le free_Tableau(t5)) ?

    Merci encore.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    excusez -moi, lisez t2 au lieu de t5

  9. #9
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    est-ce que mon t5 est bien effacé de la mémoire ou est-ce seulement le t5->data qui est effacé ?
    non, t2 n'est pas libéré. tu as bien libéré t2->data via free_Tableau, mais pas t2

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    aïe, je m'en doutais car j'avais deux malloc et un seul free. Et comment dois-je libérer t2 ?
    que dois-je taper free(??) ?

    Merci beaucoup de votre patience.

  11. #11
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ben puisque tu fais t2 = malloc(), il faut faire le free(t2) qui va avec.
    C'est vraiment simple: a un malloc() doit correspondre un free().

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    oups, effectivement, c'était un peu stupide comme question.

    Merci de votre patience et de vos explications en tout cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur windows lors du malloc
    Par Elessar dans le forum C
    Réponses: 5
    Dernier message: 16/12/2003, 08h53
  2. malloc et free
    Par barthelv dans le forum C
    Réponses: 3
    Dernier message: 22/07/2003, 18h34
  3. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52
  4. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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