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 :

erreur de compilation avec malloc


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Par défaut erreur de compilation avec malloc
    Bonjour,
    Je ne comprend pas mon erreur lorsque je compile la partie qui suit:
    (client est une structure).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    	client  *x;
     
                    x = malloc(sizeof(*x));
    lorsque je compile, j'ai comme erreur (pour la dernière ligne ci-dessus):
    invalid conversion from 'void*' to 'client*'

    Merci pour vos réponces.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Déjà, malloc devrait etre évité en C++

    Ensuite, s'il est utilisé, il faut prendre l'habitude de "transtyper" le retour de cette fontion dans le type souhaité (alors que ce n'est pas requis en C).

    Il faut donc, idéalement, utiliser new sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client *x;
    x = new client(/*parametres éventuels */);
    (utiliser delete au lieu de free ) ou, si tu tiens à utiliser malloc et free, l'utiliser sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client *x;
    x=(client)malloc(sizeof(client));
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Perdu, c'est:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client *x;
    x = static_cast<client*>(malloc(sizeof *x));
    En C++, il faut éviter les casts C autant que possible, parce qu'ils permettent n'importe quoi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Medinoc > Sauf que ton code à un comportement indéfini puisque tu déférence un pointeur non initialisé.
    Ca peut donner n'importe quoi (crash de l'appli, du PC, ou pire, renversement de NS ou encore hiver nucléaire )
    Le bon code c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client *x;
    x = static_cast<client*>(malloc(sizeof client));
    Mais le mieux restant quand même new.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Medinoc > Sauf que ton code à un comportement indéfini puisque tu déférence un pointeur non initialisé.
    Perdu, l'expression à droite d'un sizeof n'est pas évaluée, car sa valeur est inutile, seul son type compte.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Medinoc > Sauf que ton code à un comportement indéfini puisque tu déférence un pointeur non initialisé.
    Ca peut donner n'importe quoi (crash de l'appli, du PC, ou pire, renversement de NS ou encore hiver nucléaire )
    Le bon code c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client *x;
    x = static_cast<client*>(malloc(sizeof client));
    Mais le mieux restant quand même new.
    Euh, je ne pense pas que le *p soit évalué, j'en veux pour preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
     
    int main(void)
    {
      char *p=NULL;
      std::cout << sizeof(*p) << std::endl;
      return 0;
    }
    Ce code devrait provoquer un plantage si *p était évalué or ce n'est pas le cas. Le code de Médinoc me semble donc tout à fait correct.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Et j'enfonce le clou, le pointeur n'est pas déréférencé lors d'un sizeof.

    On peut même mettre un appel de fonction dans un sizeof, et la fonction ne sera pas appelée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct a { ... };
     
    struct a * fonc(int);
     
    size_t cb = sizeof *fonc(42); /* fonc() ne sera pas appelée,
                                     et cb sera toujours égal à sizeof(struct a) */
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Oui enfin bref, un malloc en C++ c'est comme une doudoune en été:
    c'est lourd, inutile, inapproprié et ça pose plein de problèmes

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Alors vous m'en bouchez un coin.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. Erreur de compilation avec APRO
    Par netchip dans le forum Langage
    Réponses: 1
    Dernier message: 22/04/2006, 23h12
  2. Erreur de compil avec Outp
    Par sixon dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2006, 15h01
  3. Erreur de compilation avec SWITCH et CASE
    Par barbarello dans le forum C++
    Réponses: 4
    Dernier message: 21/01/2006, 21h47
  4. [FreePascal]Erreur de compilation avec Dev-Pascal
    Par youngeikichi dans le forum Free Pascal
    Réponses: 3
    Dernier message: 17/02/2005, 14h22
  5. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29

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