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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

  5. #5
    Rédacteur

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

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    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 éclairé
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 371
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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