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 :

recopie de memoire avec memmove


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20
    Par défaut recopie de memoire avec memmove
    Bonjour à tous,

    je planche un petit peu sur une histoire de recopie de mémoire (qui je dois le préciser ne fonctionne pas...)

    J'ai la structure suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct ElementListePile{
      void *attribut;
      struct ElementListePile *suivant;
    } ElementPile;
    et souhaite recopier la valeur mémoire d'un void* dans mon "attribut".

    j'utilise actuellement cette façon (je ne test pas le malloc sur l'attribut mais de la mémoire lui est bien allouée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ElementPile *nouveau_element;
      if ((nouveau_element = (ElementPile *) malloc (sizeof (ElementPile))) == NULL)
        return -1;
      nouveau_element->attribut = malloc(sizeof(size));
      nouveau_element->attribut = memmove(nouveau_element->attribut, donnee, sizeof(size));
    Or le memmove ne fait strictement rien.. et je ne comprend pas pourquoi.
    NB : "donnee" est un void* correspondant à la réference d'un double sur ce problème
    "size" vaut 8

    Si quelqu'un est capable de m'éclairer, je l'en remercie d'avance.

    ++,
    Adrien

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 20
    Par défaut [Résolu] :) je ne sais pas comment éditer les post
    ... sizeof(size) ...
    Besoin de dormir un peu je crois

  3. #3
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ElementPile *nouveau_element;
    if ((nouveau_element = (ElementPile *) malloc (sizeof (ElementPile))) == NULL)
    return -1;
    nouveau_element->attribut = malloc( size );
    nouveau_element->attribut = memmove(nouveau_element->attribut, donnee, 8 );
    sizeof( size ) : tu veux la taille d un int ou d un long ou le nombre contenu dedans "size" ?

    Est tu sur que donnee n est pas NULL ?
    pourquoi ne pas utiliser memcpy ? (memmove est plus gourmand en ressource, mais memcpy les zones ne doivent pas se chevaucher).

    Comment sais tu que memmove ne fait rien ?

    P.S. : pense a la balise code la prochaine fois.

  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 LlufRuS Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ElementPile *nouveau_element;
      if ((nouveau_element = (ElementPile *) malloc (sizeof (ElementPile))) == NULL)
        return -1;
      nouveau_element->attribut = malloc(sizeof(size));
      nouveau_element->attribut = memmove(nouveau_element->attribut, donnee, sizeof(size));
    Or le memmove ne fait strictement rien.. et je ne comprend pas pourquoi.
    NB : "donnee" est un void* correspondant à la réference d'un double sur ce problème
    "size" vaut 8

    Si quelqu'un est capable de m'éclairer, je l'en remercie d'avance.
    memmove() fait bien la recopie, mais les infos de taille sont fausses. de plus, il n'est utile de toucher au pointeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      nouveau_element->attribut = malloc(size);
      memmove (nouveau_element->attribut, donnee, size);
    Nota : pourquoi memmove() ? Son usage est requis quand il y a recouvrement. Ce n'est pas le cas ici. Tu peux utiliser sans crainte memcpy() (plus efficace).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      nouveau_element->attribut = malloc(size);
      memcpy (nouveau_element->attribut, donnee, size);
    Enfin, je suis étonné que tu recopies des données. Est-ce bien nécessaire ? Si elles sont persistantes (chaine, statique, allouée, locale de haut niveau), il suffit de mémoriser l'adresse, ou alors de passer (et de mémoriser) une information 'faire copie' ou non... Seul l'utilisateur le sait...

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

Discussions similaires

  1. Problemes de memoires avec les tableaux: outOfMemoryError
    Par Battosaiii dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2006, 16h50
  2. Allocation Dynamique de Memoire Avec Operateur New
    Par msstaf dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/06/2006, 15h49
  3. Acceder à la carte mémoire avec Linux Familiar
    Par omega67 dans le forum Linux
    Réponses: 1
    Dernier message: 15/04/2006, 13h08
  4. La mémoire avec ps
    Par Invité dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 14/12/2005, 15h17
  5. carte memoire avec film (vente)
    Par numeror dans le forum Périphériques
    Réponses: 42
    Dernier message: 09/08/2005, 13h52

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