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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

  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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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 : 50
    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
    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 chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 444
    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