2010-06-03 7 views
0

Comment écrire une instruction if qui indique au programme si le pointeur est assigné ou pas?Un pointeur est-il affecté ou non à C?

exemple MAUVAIS

if (*badpdr[0]==0); 
+2

Note: Il est possible que vous, au cours d'essayer de résoudre ce problème, découvrez une fonction appelée 'IsBadPtr'. ** Ne l'utilisez pas! ** – Brian

+0

pourquoi ne pas utiliser isbadptr? – gkaykck

+1

Lire http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx – Brian

Répondre

6

Vous voulez dire if (badptr==NULL)?

Notez que vous devez d'abord définir votre pointeur sur NULL lorsque vous le définissez ou lorsque vous le "désaffectez" (par exemple, vous supprimez l'objet auquel il fait référence). Sinon, il contiendra des ordures et ce test échouera parce que la valeur ne sera pas un 0.

Vous pouvez également faire la comparaison à 0 au lieu de NULL, il y a déjà assez d'arguments sur SO qui est la forme correcte, donc j'ai gagné ne les répète pas.

+0

NULL n'est plus C++? – Simon

+1

Bien que pour être juste, en C c'est votre propre tâche pour vous assurer que badptr est NULL. Donc, initialisez-le à NULL (si vous ne l'initialisez pas à quelque chose d'autre) et suivez une instruction delete avec ptr = NULL. Cependant, c'est quelque chose que vous devriez faire de toute façon, donc il n'y a pas de réel inconvénient. – Jasper

+0

@Simon: Je ne suis pas sûr, beaucoup d'années depuis que j'ai écrit/enseigné ANSI-C, et mon esprit a été assombri par C++ (bien que cela ait été beaucoup d'années depuis que j'ai écrit quelque chose :) :) – Uri

3
char *ptr=NULL; 

d'initialiser le pointeur sur NULL; Plus tard, vous pouvez vérifier si c'est NULL pour voir si elle est valide avant d'essayer de la déférer.

0

Vous pouvez installer le gestionnaire de signaux pour SIGSEGV puis essayer de déréférencer le pointeur - si vous vous trouvez à l'intérieur de gestionnaire de signal, pointeur n'a pas été affecté (ou des points à l'adresse mémoire invalide, ce qui est fondamentalement la même chose)

Cependant, il peut y avoir des situations où un pointeur non affecté pointe vers une adresse valide qui appartient à l'espace mémoire du processus - dans ce cas, il n'y aura pas de SIGSEGV déclenché.

+0

Un downvoter serait-il si gentil d'expliquer le downvote? Vous ne pouvez pas aimer la réponse pour une raison quelconque, mais ce n'est pas faux. – qrdl

+0

Si vous utilisez un gestionnaire de signal et essayez de déréférencer le pointeur et que le pointeur se trouve dans une zone en dehors de la mémoire disponible, il lancera une exception magique qui ne pourra être lancée qu'une seule fois. Ensuite, lorsque vous essayerez plus tard d'allouer de la mémoire, l'allocateur recherchera cette exception pour voir s'il doit augmenter l'espace d'adressage et ne le verra pas, et les choses ne fonctionneront pas correctement. Notez que tout le texte précédent est légèrement décalé, puisque je l'écris à partir de mes souvenirs plutôt flous d'un article qui explique pourquoi c'est une mauvaise idée d'essayer de valider la mémoire par déréférencement. – Brian

+0

@Brian Quelles exceptions parlez-vous? La question concerne C, pas C++, et C n'a aucune exception. J'ai écrit sur le signal, pas d'exception, et le signal est une chose très différente. Je pense que vous avez mélangé deux concepts absolument différents. – qrdl

1

En C++ lorsque int variables ne sont pas affectées, elles ont la valeur initiale de 2686392!

0

Vous pouvez utiliser une macro qui fait le travail:

#define NP_CHECK(ptr) \ 
    { \ 
     if (ptr == NULL) { \ 
      fprintf(stderr, "%s:%d NULL POINTER: %s\n", \ 
       __FILE__, __LINE__, #ptr); \ 
      exit(-1); \ 
     } \ 
    } \ 
Questions connexes