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 dans une fonction


Sujet :

C

  1. #21
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    effectivement oui j'ai plus l'erreur de segmentation. cependant je pense que le free(matt) n'a pas vraiment l'effet voulu et j'oterait pour un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     releaseMat(matt);
    void realeaseMat(struct Mat *p)
    {
        free(p->data);
    }
    non?

  2. #22
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    cependant je pense que le free(matt) n'a pas vraiment l'effet voulu et j'oterait pour un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    releaseMat(matt);
    void realeaseMat(struct Mat *p)
    {
        free(p->data);
    }
    Si, si, il a l'effet voulu, mais j'avais effectivement oublié le second free().

    Tiens, j'ai remodifié ton code, et j'ai également rajouté quelques printf pour que tu comprennes un peu le déroulement des choses (en espérant n'avoir rien oublié cette fois) :

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    struct Mat
    {
        int i;
        int j;
        char *data;
    };
     
    struct Mat* fillMat(int,int,char*);
     
    void releaseMat(struct Mat **p)
    {
        printf("\nreleaseMat - Dealloc memoire : %p %p\n",*p,(*p)->data);
        free((*p)->data);
        free(*p);
        *p=NULL; /* on remet 'matt' (dans main()) à NULL */
    }
     int main(void)
    {
        int i,j;
        char tbl[2][2]={{0,2},{9,2}};
     
        struct Mat *matt = fillMat(2,2,&tbl[0][0]);
        printf("\nmain - matt=%p - matt->data=%p\n",matt,matt->data);
        printf("main - Affichage :\n");
        if (matt!=NULL)
        {
            for (i=0; i<matt->i ; i++)
            {
                for(j=0; j<matt->j ; j++)
                {
                    printf("%d  ",matt->data[i*matt->j + j] );
                }
                printf("\n");
            }
            printf("\nmain - Fin affichage\n");
            releaseMat(&matt); /* on passe l'adresse du pointeur afin de pouvoir modifier la valeur du pointeur "à distance" */
        }
        printf("\nmain - matt=%p\n",matt);
        return 0;
    }
     
    struct Mat* fillMat(int row,int col,char *mat)
    {
        int i,j,index=0;
        struct Mat *A;
        if ( (A=malloc(sizeof (struct Mat))) !=NULL)
        {
            A->i=row;
            A->j=col;
            if ( (A->data=malloc(row*col*sizeof *(A->data))) !=NULL)
            {
                printf("\nfillMat - Alloc memoire : %p %p\n",A,A->data);
                printf("fillMat - Alloc memoire reussie.\n");
                for(i=0;i<2;i++)
                {
                    for(j=0;j<2;j++)
                    {
                        A->data[index]=mat[index];
                        index++;
                    }
                }
            } else /* si le second malloc échoue, on libère tout */
            {
                free(A);
                A=NULL;
            }
        }
        if (A==NULL) printf("fillMat - Echec alloc memoire.\n");
        return A;
    }

  3. #23
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    merci beaucoup c'est vraiment magnifique.
    je comprend un peu mieux, enfaite je me rend compte que j'ai au probleme de conception. car j'avais essayer la meme chose que tu viens d'ecrire avec quelques erreures en plus. merci pour l'explication je vais m'exercer encore sur ce point merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Recuperation de formulaire dans une fonction
    Par arsgunner dans le forum ASP
    Réponses: 5
    Dernier message: 23/06/2004, 15h04
  2. Transmission d'un objet crée dans une fonction
    Par EvilAngel dans le forum ASP
    Réponses: 2
    Dernier message: 10/05/2004, 20h19
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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