2017-09-26 5 views
0

Je veux évaluer un pointeur est nul ou non par une condition if comme ci-dessous:pointeur NULL ne répond pas à l'emplacement de 0x0 dans cpp

Model * model; 
if(model == nullptr){ 
    //do something... 
} 

Mais cela ne fonctionne pas, strangly le pointeur de modèle au lieu de pointant vers l'emplacement 0x0 il pointe 0xcdcdcdcdcdcdcdcd emplacement mémoire, puis model==nullptr ne fonctionne pas pour cela, je l'ai fait aussi if(model), if(model== NULL) ceux-ci sont également ne fonctionnent pas!

une idée sur ce problème?

+2

S'il vous plaît arrêter de spammer les tags non pertinents. Il n'y a pas de 'nullptr' dans ** [tag: C] **. –

Répondre

7

Un pointeur non initialisé ne doit pas pointer vers NULL. Il peut pointer n'importe où.

+1

Les pointeurs Null doivent être égaux à l'expression '0x0' –

+0

@ M.M Cela est vrai, mais pour cela, vous devez définir le pointeur sur' nullptr' à un moment donné. Jusque-là, il n'est pas initialisé et son contenu est déterminé par l'implémentation. –

-3

qui IDE que vous utilisez si vous utilisez Visual Studio il utiliser NULL comme ce

mais voici la solution

Model * model=NULL; 
if(model == NULL){ 
    //do something... 
} 
+0

Bien qu'il soit assez lent pour supporter correctement les dernières révisions standard C++, 'nullptr' est supporté par MSVC depuis un certain temps. Depuis qu'ils ont commencé à soutenir C++ 11. – StoryTeller

+0

il n'est pas l'IDE mais le compilateur qui ne supporte 11 C++ ou non – user463035818

1

Ce code appelle Comportement non défini, puisque votre pointeur est uninitialized!

Vous devez initialiser votre pointeur sur nullptr, puis vérifier, sinon, sa valeur est garbage (cela peut être n'importe quoi).

PS: pointeurs NULL doivent être égaux à l'expression 0x0.

0

Le pointeur Model * model; prendra une valeur aléatoire des déchets en fonction de l'emplacement de la mémoire à laquelle s'attribué le pointeur. Les normes C/C++ n'imposent pas que les pointeurs déclarés mais non initialisés soient automatiquement initialisés à NULL (ou toute valeur par défaut).

Maintenant, je ne suis pas vraiment clair pourquoi le pointeur est comparé à NULL immédiatement après la déclaration, mais cette comparaison est logique après le pointeur se voit attribuer une valeur retournée par une fonction ou une expression:

Model * model = some_func(/* .. */); // This would be 
if (model == NULL) {     // a valid usage 
}