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 :

Différence NULL et chaine vide


Sujet :

C++

  1. #1
    bruce-willis
    Invité(e)
    Par défaut Différence NULL et chaine vide
    Bon après-midi à tous !

    Je suis devenu parano du type NULL après avoir passé des heures sous SQL Server (Transact-sql)
    Je me demande alors dans le cas de C++ si char* c = NULL équivaut à char* c = "" ainsi que int a = 0 équivaut-il à int a = NULL
    De même pour le type pointeur en général, pourquoi un pointeur est quelquefois égal à 0xCDCDCDCD ou 0xCCCCCCCC

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Je me demande alors dans le cas de C++ si char* c = NULL équivaut à char* c = ""
    Certainement pas.
    À noter que char* c = "une chaîne littérale" est déprécié et devrait causer des erreurs avec les bons avertissement.
    Préférer const char* c = "une chaîne littérale";

    char* c = NULL déclare un pointeur nul.
    const char* c = ""; déclare un pointeur vers un octet nul se situant dans la zone mémoire statique en lecture seule.
    Boost ftw

  3. #3
    screetch
    Invité(e)
    Par défaut
    CDCDCDCD et CCCCCCCC sont des pointeurs qui n'ont pas ete initialisé. Pour etre precis, CCCCCCCC est un pointeur variable locale ou membre de variable locale non initialisé (sur la pile) et CDCDCDCD est un pointeur membre d'un objet alloué avec new.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sachant que ces valeurs ne sont garanties par aucun standard. On les trouve généralement sous Visual quand on compile en mode debug.
    Voir: Magic debug values
    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.

  5. #5
    bruce-willis
    Invité(e)
    Par défaut
    En résumé donc:
    char* c = NULL déclare un pointeur nul.
    const char* c = ""; déclare un pointeur vers un octet nul se situant dans la zone mémoire statique en lecture seule.
    D'accord !!!



    Pour les pointeurs en Visual C++ uniquement:
    0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
    0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory

    À noter que char* c = "une chaîne littérale" est déprécié et devrait causer des erreurs avec les bons avertissement.
    Préférer const char* c = "une chaîne littérale";
    Je note mais pourquoi devrait causer des erreurs avec les bons avertissement.

  6. #6
    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
    Car c'est un pointeur non constant sur une zone de mémoire constante (statique même)
    "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)

  7. #7
    bruce-willis
    Invité(e)
    Par défaut
    D'accord alors
    Mais int n = NULL équivaut int n = 0

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Oui. NULL vaut 0. Mais conventionnellement, on n'utilise cette macro que dans le contexte d'un pointeur. Ce qui n'est pas le cas ici. Si je tombais sur ce genre de code, je le corrigerai immédiatement, avant que d'aller dire ma façon de penser à son auteur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    NULL vaut 0
    C'est garanti dans la norme ca ?

    Quoiqu'il en soit la valeur de NULL n'a que peu d'importance. Ce n'est qu'une macro permettant de définir qu'un pointeur ne pointe vers rien. Il ne faut jamais l'utiliser sur une variable, ca n'a pas de sens ! Tout nouveau pointeur doit être initialiser a NULL ainsi que tout pointeur pointant sur une zone mémoire qui vient d'être libérée. Ca évite de se retrouver avec des pointeurs pointant sur des zone mémoire non valide.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Mode chipotage, pas besoin de suivre ce qui suit pour comprendre comment fonctionne NULL :

    Il est défini dans un header standard, et dans cet header, il est défini comme valant 0. Donc, oui, NULL est un entier valant 0 (attention d'ailleur sur la surcharge de fonction).

    Ensuite, si on cast un entier valant 0 en pointeur, le résultat du cast vaut une "null pointer constant", qui est une valeur spéciale dont la représentation interne n'est pas précisée (on sait juste qu'aucun pointeur valide ne peut avoir cette valeur).

    En C++0x, il y aura null_ptr qui permet d'éviter l'ambiguïté.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    (On continue le mode chipotage)

    NULL peut aussi etre defini comme 0L ou n'importe quelle expression constante entiere de valeur nulle, ca complique encore un peut l'effet potentiel sur la surcharge.

    NULL est complique aussi dans le cas des fonctions variadiques (celles a nombre variable d'arguments, comme printf), on en a normalement peu en C++ mais il y en a aussi dans des API de POSIX. Quand on veut passer un pointeur nul a une telle fonction, il faut caster NULL en void*.

    Pour finir les complications, en C, NULL peut (mais pas doit) aussi etre definit comme une expression constante entiere de valeur nulle castee en void*.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  12. #12
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    En C++0x, il y aura null_ptr qui permet d'éviter l'ambiguïté.
    Ah tiens, c'est plus nullptr? Ils ont changé le nom?

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Nan, c'est juste moi qui fatigue : C'est bien nullptr.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par bruce-willis Voir le message
    Bon après-midi à tous !

    Je suis devenu parano du type NULL après avoir passé des heures sous SQL Server (Transact-sql)
    Attention ! NULL en SQL et NULL en C/C++ n'ont pas tout-à-fait la même signification.

    En C/C++, on utilise NULL pour initialiser un pointeur par défaut, et indiquer qu'il ne contient aucune valeur, ou pour réinitialiser n'importe quelle autre variable. La manière la plus naturelle de le faire est bien sûr de le/la ramener à zéro, mais au moins, au niveau du code source, cela permet de savoir ce que l'on fait.

    En SQL, le marqueur NULL est là pour indiquer l'indisponibilité de la valeur. Ce serait plus proche d'un « N/A », à ceci près qu'un NULL peut avoir de multiples origines. C'est important quand on fait l'hypothèse du monde ouvert ou clos (INNER ou OUTER JOIN).

Discussions similaires

  1. Différence entre chaine vide et chaine nulle
    Par brassouille dans le forum PL/SQL
    Réponses: 2
    Dernier message: 30/12/2008, 11h04
  2. Gérer Null - zéro - Chaine vide
    Par Lucas Panny dans le forum Développement
    Réponses: 10
    Dernier message: 28/08/2008, 15h40
  3. [V10/XE] chaine vides vs nulles :cry:
    Par 250rgv dans le forum Oracle
    Réponses: 5
    Dernier message: 25/08/2006, 09h32
  4. [8i]Chaine vide et NULL
    Par payenneville dans le forum Oracle
    Réponses: 10
    Dernier message: 26/01/2006, 18h55
  5. [BDD] renvoyer une chaine vide au lieu de null
    Par cmoulin dans le forum JDBC
    Réponses: 6
    Dernier message: 06/05/2004, 11h38

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