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 à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 13
    Points
    13
    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 sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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));

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

  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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    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.

  5. #5
    Membre éclairé

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    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 actif
    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
    Points : 219
    Points
    219
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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) */

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    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 266
    Points : 6 688
    Points
    6 688
    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 : 32
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Alors vous m'en bouchez un coin.

+ 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