Comment vérifier si un pointeur de pointeur NULL?

Je pense toujours simplement if(p != NULL){..} va faire le travail. Mais après la lecture de ce Débordement de Pile question, il ne semble pas.

Alors, quelle est la manière canonique pour vérifier des pointeurs NULL après l'absorption de la discussion à cette question qui dit pointeurs NULL peut avoir une valeur non nulle?

  • Ce n'est pas c...c'est un c++ fil... personnellement, j'irais avec: if(p) {...}
  • Vous vous faites trop de - votre code est très bien, même en C++. Que le débat était entre certains de langue avocats - c'est une sorte de "combien d'anges peuvent danser sur la tête de la broche" choses".
  • va if(p) être différent de if(p != NULL)?
  • lorsque vous n'avez pas inclus un fichier d'en-tête qui définit la valeur NULL, on va compiler, de l'autre l'habitude...
  • ce cas ,c'est différent 🙂 Mais vous n'avez pas mentionné ce qui est discuté dans ce thread,qui dit parfois des pointeurs NULL peut avoir une valeur non nulle...Dans ce cas,les deux if(p) et if(p!=NULL) échoue,je pense.
  • L'interne rep d'un pointeur NULL peut, en théorie, avoir une valeur non nulle (en fait, ils ne le font pas), mais ce n'est rien pour vous de vous inquiéter.
  • Butterworth ,si le représentant de pointeur NULL n'est pas un non-zéro,les deux if(p) et if(p!=NULL) échoue,je n'ai pas de raison de ne pas s'inquiéter à ce sujet.
  • Non, ils ne seront pas parce qu'ils ne sont pas à l'aide de l'interne rep - votre code est bien! C'est la façon dont TOUS les code C et TOUS les code C++ est écrit: ce thread est un résumé des débats intellectuels sur le libellé de la norme C++. Vous obtenez beaucoup de ce sur le C++ balises.
  • Butterworth ,deux fils sur le même sujet par les deux réponse différente,mais je décide de coller à la mienne:)
  • en C, même if (p != 0) va "travailler" lors de la représentation interne n'est pas tous les bits à zéro.
  • Ack! Je pense que le point est que, même si en interne NULL n'est pas 0, un pointeur null aura toujours la valeur NULL. Il suffit de ne pas #define NULL p, et de garder le sourire.
  • et en C++ aussi. Ma tentative de l'expliquer: dans les deux langues, NULL est un pointeur null, sinon il convertit un pointeur null (en C, il est dépendant de l'implémentation qui, en C++, c'est toujours le dernier). Et dans les deux langues pointeurs null comparer l'égalité. C'est complètement hors de propos que de pointeurs null avoir tous les bits à zéro ou pas, 0 (ou toute autre expression constante entière avec la valeur 0) et NULL convertir aux pointeurs null, pas (forcément) des pointeurs avec tous les bits à zéro.
  • Ce thread explique si la valeur NULL peut être définie avec une valeur non nulle ou pas. C est à partir de C++, parce que en C++, NULL, 0, fin de l'histoire. En C, la valeur NULL est quelque chose de magique qui s'affiche lorsque vous transtypage de l'entier 0 en un pointeur.
  • À la fois le C et le C++ sont (presque) identiques à cet égard. Vous ne pouvez pas comparer directement un pointeur avec un int. Le int doit d'abord être converti en un pointeur. Si (et seulement si) le int est partie intégrante de l'expression constante de l'évaluation à 0, il y a une conversion implicite, ce qui résulte en un pointeur null. (Dans C, il existe une autre possibilité). Les résultats de cette conversion va être tout ce que la mise en œuvre exige. Et si vous écrivez simplement if (p), le langage définit ce sera l'équivalent exact de if (p != 0).
  • Les exigences pour la définition de NULL sont identiques, mot pour mot, dans le C et le C++ standard. Dans les deux cas, il se définir comme un "pointeur null constante". Traditionnellement, 0, mais tout "de la constante expression intégrale de l'évaluation à 0" est autorisée; en C, la définition de "pointeur null constante" permet aussi de cette à être jeté à void*, mais qui n'a vraiment pas de changer quoi que ce soit. Dans les deux cas, la conversion d'un pointeur null constante dans un pointeur null est le compilateur de la magie.
  • Pour garder les questions plus clair: NULL est une macro définie dans <stddef.h> (et quelques autres en-têtes). NULL n'est pas un pointeur null; il faut être défini comme un "pointeur null constante" (qui est en C++, ne peut pas être un pointeur, et en C, traditionnellement, n'est pas un pointeur). Il y a trois concepts distincts qui doivent être traitées: NULL, un pointeur null, et d'un pointeur null constante. Et comment un pointeur null est physiquement représenté (sa séquence de bits) est complètement indépendante des deux autres.
  • J'ai enlevé c++ parce qu'en C++, la situation est complètement différente: stackoverflow.com/questions/17772103/...

InformationsquelleAutor cpuer | 2011-05-31