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 :

Pointer, Allocation et C


Sujet :

C

  1. #1
    Membre actif Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Points : 252
    Points
    252
    Par défaut Pointer, Allocation et C
    Bonjour,

    Dans une de mes programmation, je souhaite faire une petite tembouille dans les variables...

    J'ai une fonction void getMyPath qui prend en paramètre un pointeur, je voudrais au sain de cette fonction allouer de la mémoire pour ce pointeur et lui affecter une valeur.
    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
     
    void getMyPath( void *sOutVar ) {
      LPCSTR PerfData = "Une valeur variable prise dans le registre";
      DWORD BufferSize = XXX; //Où XXX est le nombre de bytes que je connais
     
      //Ici tout ce complique...
      sOutVar = malloc(BufferSize);
      ZeroMemory(sOutVar, BufferSize);
      strcpy(sOutVar, BufferSize);
      free(PerfData) //PerfData est dynamique (Il y a un malloc dans le code)
    }
     
    [...][...]
     
    //dans main
    LPSTR sPathTo = NULL
     
    getMyPath(&sPathTo);
     
    //Plus tard dans main
    free(sPathTo);
    Voila je suppose que je ne m'y prend pas dutout comme il faut, je vous invite donc à me corriger

    Merci !

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Deux solutions:

    Ma préférée :

    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
     
    void* getMyPath() {
      LPCSTR PerfData = "Une valeur variable prise dans le registre";
      DWORD BufferSize = XXX; //Où XXX est le nombre de bytes que je connais
     
      sOutVar = malloc(BufferSize);
     
      if(sOutVar==NULL)
         {
         /*Gestion de l'erreur*/
         }
      ZeroMemory(sOutVar, BufferSize);
      /*Copie fausse*/
      free(PerfData) //PerfData est dynamique (Il y a un malloc dans le code)
      return sOutVar;
    }
     
    [...][...]
     
    //dans main
    LPSTR sPathTo = NULL;
     
    sPathTo = getMyPath();
     
    //Plus tard dans main
    free(sPathTo);
    ou alors:

    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
     
    void getMyPath(void **ptr) {
       LPCSTR PerfData = "Une valeur variable prise dans le registre";
       DWORD BufferSize = XXX; //Où XXX est le nombre de bytes que je connais
     
      *ptr = malloc(BufferSize);
     
      if(*ptr==NULL)
          {
          /*Gestion de l'erreur*/
          }
       ZeroMemory(*ptr, BufferSize);
     
      /*Copie fausse*/
     
       free(PerfData) //PerfData est dynamique (Il y a un malloc dans le code)
    }
     
     [...][...]
     
     //dans main
     LPSTR sPathTo = NULL;
     
    getMyPath(&sPathTo);
     
     //Plus tard dans main
     free(sPathTo);
    Mais fait attention, c'est un pointeur void* que tu as, si tu fais un strcpy c'est donc des chaînes de caractères, il vaudrait mieux mettre tout en char*...

    Ton utilisation de strcpy est fausse, je te conseille de regarder longuement avant de t'en servir...

    Page man : http://man.developpez.com/man3/strcpy.3.php

    En conclusion, tu joues avec des choses pas évidentes et pas facile, je te conseille de faire attention...

    Jc

  3. #3
    Membre actif Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Points : 252
    Points
    252
    Par défaut
    Merci pour ta réponse rapide et efficace.

    Pour les pointeur void, pas de problème je suis en train de lire les docs là deçus, donc c'est en cours

    Pour le strcpy en lisant la doc (déjà lu en large en long et en travers), je comprend que je ne peut l'utiliser que avec un pointeur vers une chaine, et non pas avec un pointeur vers pointeur d'une chaine ?

    Je me trompe ?

    Tu me conseillerais quoi ?
    Encore merci.

    PS: j'apprend le C donc je suis ouvert à toute les critiques.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Pikwik
    Pour le strcpy en lisant la doc (déjà lu en large en long et en travers), je comprend que je ne peut l'utiliser que avec un pointeur vers une chaine, et non pas avec un pointeur vers pointeur d'une chaine ?
    Voir memcpy: http://man.developpez.com/man3/memcpy.3.php

    Jc

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/11/2005, 18h22
  2. Réponses: 4
    Dernier message: 03/12/2002, 16h47
  3. [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
  4. Allocation de ressources
    Par Eric Pasquier dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/10/2002, 09h19
  5. [Pointer]Treeview.Data
    Par rbag dans le forum Composants VCL
    Réponses: 7
    Dernier message: 31/08/2002, 01h44

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