If (pointeur){}; signification?

Résolu/Fermé
Utilisateur anonyme - 19 déc. 2013 à 10:34
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 19 déc. 2013 à 19:41
Bonjour,

Mon problème concerne ceci :
if (pointeur)
{}

J'aurais besoin d'une petite précision sur ces structures de contrôle prenant un pointeur pour condition (vous savez? celles qui permettent par exemple de protéger les fonctions contre un segfault), cela vérifie-t-il que le pointeur a de la mémoire d'allouée ou que ce pointeur est différent ou égal à NULL?

À priori je dirai plutôt que c'est pour vérifier que ce pointeur a ou non de la mémoire d'allouée, puisqu'un pointeur non alloué n'a pas forcément NULL pour valeur, me trompé-je?
Par conséquent :
if (!(ptr))
{
}
et
if (ptr != NULL)
{
}
Ne sont pas équivalents?

Merci d'avance :)

3 réponses

Utilisateur anonyme
19 déc. 2013 à 11:48
Bonjour

Il n'y a pas de règles spéciales pour les pointeurs dans les conditions.
En C, une condition (dans un if ou un for par exemple) est une expression comme une autre. Elle est assimilée à "faux" si elle vaut 0 et à "vrai" pour toute autre valeur.

(ptr) est vrai si et seulement si PTR n'est pas NULL.
!(ptr) est vrai si et seulement si PTR est NULL.

alors que
(ptr !=NULL) est vrai si et seulement si PTR n'est pas NULL.

Donc tes conditions sont exactement le contraire l'une de l'autre.

Tu as raison en te méfiant de ce test, il ne protège de rien si on n'a pas pris soin d'initialiser un pointeur à NULL, et de le remettre à NULL chaque fois qu'on désalloue.
0
Utilisateur anonyme
19 déc. 2013 à 12:06
Merci pour ta réponse!|
J'ai effectivement inversé les deux conditions, ce n'était pas clair pour moi.
Donc ces tests permettent uniquement de savoir si le pointeur est à NULL ou non, et ce n'est pas fiable si on a un pointeur non alloué différent de NULL? Ça ne permet pas de savoir si il y a ou non de la mémoire d'allouée?
Comment puis-je protéger une fonction contre les segfault dans ce cas?
0
Utilisateur anonyme
19 déc. 2013 à 14:26
Comment puis-je protéger une fonction contre les segfault dans ce cas ?
Si tu ne sais pas d'où vient le pointeur, tu ne peux tout simplement pas éviter l'erreur. Au mieux, tu peux la capturer et la gérer toi-même, je ne suis pas un pro du C mais il existe peut-être des mécanismes qui le permettent comme dans certains langages.

Mais en général, le pointeur vient d'une autre de tes fonctions. Si tu initialises correctement tes pointeurs et que tu les remets bien à NULL à la désallocation, ces tests sont tout à fait valables.
0
Utilisateur anonyme
19 déc. 2013 à 14:37
entendu, merci! :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
19 déc. 2013 à 19:41
Bonjour,

Le Père a tout dit. J'apporte simplement une précision.
En C standard il ny a pas de mécanisme d'exception. Cependant on peut simuler ce mecanisme via setjmp() longjmp(). Mais attention, cest beaucoup moins puissant (pas de destruction, etc.). En pratique, on fait comme Le Pere a dit. Si different de NULL alors le pointer peut être utilisé par la fonction. Si ça plante, c'est la faute de l'appelant.
0