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 :

Probleme avec memcpy()


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Probleme avec memcpy()
    Bonjour,

    g un petit problème d'erreur de segmentation qui est un vraiment pénible: voila mon prog (ultra simplifié pour bien exposer le problème):
    (le prblème est sur le memcpy)

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
    	int toto = 135;
    	void *riri =malloc(4*sizeof(unsigned char));
    	void *ruru;
    	riri = toto;
    	ruru = calloc(1,4);
    	printf("riri=%d\n",riri);
     
    	memcpy(ruru,riri,4);
     
    	printf("%d\n",ruru);
     
    	return 1;
     
    }
    et lorsque j'éxecute le prog :

    rtoto@rtoto-desktop:~/test$ ./test
    riri=135
    Erreur de segmentation (core dumped)

    l'erreur de segmentation se fait sur le memcpy. Est ce que quelqu'un sait pourquoi??

    merci d'avance. (si vous connaissez la réponse, vous me sauveriez la vie lol).

    [-mod- Merci de lire les règles du forum et de veiller à utiliser les balises de code. MemCpy n'existe pas. C'est memcpy().]

  2. #2
    Membre actif Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Points : 295
    Points
    295
    Par défaut
    deja les balise CODE auraient ete bienvenues
    ensuite je pense que ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    riri=toto
    ...
    printf("riri=%d\n",riri);
    ...
    printf("%d\n",ruru);
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *riri=toto
    ...
    printf("riri=%d\n",*riri);
    ...
    printf("%d\n",*ruru);
    revoir la notion de pointeur et objet pointé
    il parait que la plume est plus forte que l'épée, heureusement j'ai une hache

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    g fait ce que tu as dit mais ca change rien. le problème persiste.

  4. #4
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par kikifricard
    Bonjour,

    g un petit problème d'erreur de segmentation qui est un vraiment pénible: voila mon prog (ultra simplifié pour bien exposer le problème):
    (le prblème est sur le memcpy)


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main()
    {
    int toto = 135;
    void *riri =malloc(4*sizeof(unsigned char));
    void *ruru;
    riri = toto;
    ruru = calloc(1,4);
    printf("riri=%d\n",riri);

    memcpy(ruru,riri,4);

    printf("%d\n",ruru);

    return 1;

    }

    et lorsque j'éxecute le prog :

    rtoto@rtoto-desktop:~/test$ ./test
    riri=135
    Erreur de segmentation (core dumped)

    l'erreur de segmentation se fait sur le memcpy. Est ce que quelqu'un sait pourquoi??

    merci d'avance. (si vous connaissez la réponse, vous me sauveriez la vie lol).
    Hé bien tu alloues de la mémoire pour le pointeur riri (4 multiplets), dont tu écrases joyeusement la valeur en lui affectant l'entier toto. Tu essayes d'imprimer un pointeur avec le spécificateur de format %d qui est pour les entiers, alors que ce devrait être le spécificateur %p (déja un comportement indéfini ici) car riri est un pointeur.
    Ensuite, tu alloues de la mémoire pour le pointeur ruru et tu essayes de copier ce qui est pointé par riri (donc ce qui est à "l'adresse 135") dans ruru. Il est fort probable que tu ne puisses pas accéder à cet emplacement mémoire, d'où le SIGSEGV. J'avoue que c'est un peu du n'importe quoi et j'ai du mal à cerner ton intention. Si tu veux copier simplement une chaine de caractères de riri dans ruru, voici un petit exemple :

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
      int toto = 135;
      unsigned char * riri = NULL, *ruru = NULL;
     
      riri = malloc(5*sizeof(*riri));
      if (!riri) {
        fprintf(stderr, "Failed to allocate riri\n");
        exit(EXIT_FAILURE);
      }
     
      ruru = calloc(1,5);
      if (!ruru) {
        fprintf(stderr, "Failed to allocate ruru\n");
        free(riri);
        exit(EXIT_FAILURE);
      }
     
      strcpy(riri,"1234");
      memcpy(ruru,riri,5);
      printf("%s\n",ruru);
     
      return 0;
    }
    A+

  5. #5
    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 kikifricard
    Bonjour,

    g un petit problème d'erreur de segmentation qui est un vraiment pénible: voila mon prog (ultra simplifié pour bien exposer le problème):
    (le prblème est sur le memcpy)
    [/COLOR]
    Merci d'utiliser des identificateurs qui ont un sens, parce que là, ce code est ésotérique...

    A part ça, tu mets un entier dans un pointeur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	int toto = 135;
    	void *riri =malloc(4*sizeof(unsigned char));
    	riri = toto;
    je ne vois pas ce que tu cherches à faire, mais là, c'est n'importe quoi.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    En fait ce que je cherche a faire, c de mettre, dans riri, 135 en binaire. cad

    *riri = 000000000000000010000111 (sur 4 octet)

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    En gros je voudrais copier bit a bit 135 en binaire dans riri

  8. #8
    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 kikifricard
    En gros je voudrais copier bit a bit 135 en binaire dans riri
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       unsigned long x = 135
       unsigned char data[4];
     
    /* format réseau (MSB en tête) */
     
       data[0] = x >> (8 * 3); /* MSB */
       data[1] = x >> (8 * 2);
       data[2] = x >> (8 * 1);
       data[3] = x >> (8 * 0);
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    merci ca marche. désolé pour le manque de précision.

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

Discussions similaires

  1. probleme avec memcpy
    Par Jeane dans le forum C++
    Réponses: 4
    Dernier message: 06/06/2006, 14h50
  2. [MFC] Probleme avec la fonction memcpy
    Par ksoft dans le forum MFC
    Réponses: 10
    Dernier message: 22/05/2006, 14h49
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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