If (pointeur){}; signification?
Résolu
Utilisateur anonyme
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Mon problème concerne ceci :
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 :
Merci d'avance :)
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 :)
A voir également:
- If (pointeur){}; signification?
- V2v signification jeune ✓ - Forum Loisirs / Divertissements
- Signification :p - Forum Mail
- ^^ Signification message ✓ - Forum Mobile
- Signification smiley :3 ✓ - Forum Loisirs / Divertissements
- Bvv signification - Forum Facebook
3 réponses
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.
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.
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.
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.
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.
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.
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?