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 :

free avec memcpy ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut free avec memcpy ?
    Bonjour,

    j'ai créé 2 matrices: tampon et *t. Je fais un memcpy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    memcpy(t,&tampon,l*colonne*sizeof(composante))
    j'ai vu que *t prend l'adresse de tampon. Que devient ce qu'il y avait a l'adresse de *t avant le memcpy ? est ce que la zone mémoire est libérée ?

  2. #2
    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 non, tu fais une copie. Donc les donnees sont repetees deux fois. Evidemment, il est important que les zones memoires ne se recouvrent pas (notamment t et tampon doivent etre differents).

  3. #3
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    Comment faire alors pour liberer tampon ? J'ai essayé en faisant:mais apres j'ai n'importe quoi dans *t.

  4. #4
    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
    En relisant ton message, je vois que tu ecris que t prend l'adresse de tampon. Ce n'est pas possible. Il y a un probleme dans ton code (et je ne comprend pas pourquoi tu fais une copie d'un bloc memoire pour liberer ensuite l'original...).

  5. #5
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    J'ai ma matrice de départ *t que je veux reorganiser. Pour cela je stocke les valeurs de ma matrice *t dans la matrice tampon (qui est locale à la fonction). par exemple la ligne 1 devient la 5 etc. ensuite je veux que *t soit reorganisée comme tampon. je fais donc un memcpy. je veux supprimer ma matrice tampon qui ne me sert plus.

    avant le memcpy:
    tampon=0x412670
    *t=0x412610

    apres le memcpy:
    tampon=0x412670
    *t=0x412670

    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
     
    void reorg(mat_dyn *t,struct seg *tab2,int ligne,int colonne)
    {
    int k,j,l;
    mat_dyn tampon;     
     
    ini_matrice(&tampon,ligne,colonne);     
    for(k=0;k<ligne;k++)
       {     
       l=tab2[k].nl;
        for(j=0;j<colonne;j++)
            tampon[adr_mrd(k,j,colonne)]=(*t)[adr_mrd(l,j,colonne)];
        }
    l=ligne;
     
    puts("matrice tampon:");
    affiche_mrd(tampon,ligne,colonne);
     
    puts("matrice t:");
    affiche_mrd(*t,ligne,colonne);
     
    // copie du contenu de la matrice tampon dans la matrice t
    if(memcpy(t,&tampon,l*colonne*sizeof(composante))==NULL)
       printf("pointeur null");
     
    puts("matrice triee:");
    affiche_mrd(*t,ligne,colonne);
     
    free(tampon);
     
    puts("matrice triee apres free:");
    affiche_mrd(*t,ligne,colonne);
     
    }

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_matrice(&tampon,ligne,colonne);
    est potentiellement dangereux : que se passe-t-il si l'initialisation n'a pas lieu ? Le programme s'arrête ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    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
    /****************************************************************/
    //initialisation de la matricre
     
    void ini_matrice(mat_dyn *matrice,int ligne,int colonne)
    {
    int i,j;
     
        *matrice=alloc_mrd(ligne,colonne);
        if(*matrice==NULL)
           {
           printf("pas assez de memoire disponible\n");
           exit(1);
           }
        for(i=0;i<ligne;i++)
           for(j=0;j<colonne;j++)       
               (*matrice)[adr_mrd(i,j,colonne)]=0;
    }

  8. #8
    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
    Je ne comprends pas tres bien ton code, et notamment ce qu'il doit faire.
    Je vois:
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tampon[adr_mrd(k,j,colonne)]= ...
    ce qui me fait penser que le type mat_dyn cache un pointeur, ce qui n'est jamais souhaitable.

    Tu ecris plus haut que tu souhaites interchanger les lignes de ta matrice. Tu n'as pas besoin d'une ligne temporaire pour cela. Tu as juste besoin d'un pointeur temporaire.
    Je m'explique avec un tableau a 2 dimensions.
    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
     
    int **array;
    int i;
    int nb_line = 3;
    int nb_col = 2;
     
    array = malloc(nb_lignes * sizeof *array);
    for(i=0; i<nb_line; i++)
    {
       array[i] = malloc(nb_col * sizeof **array);
    }
     
    /* maintenant, on a array[line][col]
     * avec 0 <= line <= nb_lines
     * et 0 <= col <= nb_col
     */
    Si tu veux echanger deux lignes, il suffit d'echanger deux array[i]:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        int *temp;
     
       /* swap line 0 and 2 */
        temp = array[0];
        array[0] = array[2];
        array[2] = temp;
    Pas de copie, juste un echange de pointeurs...

  9. #9
    Membre confirmé Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Par défaut
    DaZumba
    MessagePosté le: Lun Nov 14, 2005 17:56 Sujet du message:
    Je ne comprends pas tres bien ton code, et notamment ce qu'il doit faire.
    Je vois:
    Code:

    mat_dyn tampon;

    et
    Code:

    tampon[adr_mrd(k,j,colonne)]= ...

    ce qui me fait penser que le type mat_dyn cache un pointeur, ce qui n'est jamais souhaitable.
    Pourquoi ce n'est pas souhaitable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define composante int
    typedef composante *mat_dyn;   //tableau d'entier
     
    mat_dyn alloc_mrd(int nbl,int nbc)
     {return((mat_dyn)malloc((nbl)*nbc*sizeof(composante)));}
     
    /* macro permettant d'acceder a l'element en ligne l et 
    colonne c par m[l*nbc+c] */
    #define adr_mrd(l,c,nbc) ((l)*(nbc)+(c))

    int **array;
    cela signifie que c'est un pointeur sur un tableau ??

    Pas de copie, juste un echange de pointeurs...
    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
    void reorg(mat_dyn *t,struct seg *tab2,int ligne,int colonne)
    {
    int k,j;
    mat_dyn tampon;     
     
    ini_matrice(&tampon,ligne,colonne);     
    for(k=0;k<ligne;k++)
       {     
       l=tab2[k].nl;
        for(j=0;j<colonne;j++)
            tampon[adr_mrd(k,j,colonne)]=(*t)[adr_mrd(l,j,colonne)];
        }
     
    free(*t);
    *t=tampon;
     
    }

Discussions similaires

  1. Probleme avec memcpy()
    Par kikifricard dans le forum C
    Réponses: 8
    Dernier message: 11/06/2007, 16h56
  2. [MySQL] Probleme chez free avec les champs "geometry"
    Par gussoner dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/11/2006, 21h15
  3. comportement non attendu avec memcpy
    Par berg dans le forum C
    Réponses: 15
    Dernier message: 22/07/2006, 23h56
  4. Problème avec memcpy
    Par homeostasie dans le forum C
    Réponses: 2
    Dernier message: 28/06/2006, 15h28
  5. probleme avec memcpy
    Par Jeane dans le forum C++
    Réponses: 4
    Dernier message: 06/06/2006, 14h50

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