Qu'entend-on EXACTEMENT par “dé-référencement d'un pointeur NULL”?
Je suis un débutant complet, C, et au cours de mes travaux universitaires, je suis venu à travers des commentaires dans le code qui se réfèrent souvent à de référencement d'un pointeur NULL. Je dois avoir de l'expérience en C#, j'ai été faire par que cela peut être similaire à un "NullReferenceException" que vous obtenez dans .Net, mais maintenant, je vais avoir de sérieux doutes.
Quelqu'un peut-il m'expliquer dans les dilettantes termes, exactement ce que c'est et pourquoi c'est mauvais?
- Gardez à l'esprit cette opération aboutit à un comportement indéfini. Vous n'obtenez pas d'exceptions ou de quoi que ce soit, en C ou en C++.
- Vous pourriez mettre bas un exemple de code. Il semble que les gens (moi y compris) n'obtenez pas ce que vous essayez de le demander.
- Pas besoin de code (il n'y a pas tout) - C'est un problème conceptuel, je vais avoir, en essayant d'obtenir ma tête autour de la terminologie de "déréférencement" et pourquoi je devrais être s'inquiéter à ce sujet.
- youtube.com/watch?v=bLHL75H_VEM
Vous devez vous connecter pour publier un commentaire.
Un
NULL
d'un pointeur sur la mémoire qui n'existe pas. Cela peut être l'adresse0x00000000
ou de toute autre mise en valeur définie (tant qu'il ne peut jamais être une adresse réelle). Un déréférencement c'est tenter d'accéder à tout ce qui est pointé par le pointeur. Le*
opérateur est l'opérateur de déréférencement:C'est exactement la même chose qu'un
NullReferenceException
en C#, mais les pointeurs en C peut pointer vers n'importe quel objet de données, les éléments de même à l'intérieur d'un tableau.char *foo = NULL
et ensuite utiliser &foo ?&foo
fait référence à l'adresse de la variable appeléefoo
, ce qui est bien compte tenu de sa déclaration.Déréférencement signifie simplement la lecture de la valeur de la mémoire à une adresse donnée. Ainsi, lorsque vous avez un pointeur vers quelque chose, vers déréférencer le pointeur moyen pour lire ou écrire les données que le pointeur pointe.
En C, le unaire
*
opérateur est l'opérateur de déréférencement. Six
est un pointeur, puis*x
est ce quex
points. Unaire&
l'opérateur est le adresse de de l'opérateur. Six
est rien, alors&x
est l'adresse à laquellex
est stockée dans la mémoire. Le*
et&
opérateurs sont inverses les uns des autres: six
est de toutes les données, ety
est un pointeur, alors ces équations sont toujours remplies:Un pointeur null est un pointeur qui ne pointe sur aucune des données valides (mais ce n'est pas le seul de ce type pointeur). La norme dit qu'il est comportement indéfini déréférencer un pointeur null. Cela signifie que tout, absolument tout peut arriver: le programme pourrait tomber en panne, il pourrait continuer à travailler en silence, ou il pourrait effacer de votre disque dur (même si c'est plutôt rare).
Dans la plupart des implémentations, vous obtiendrez un "segmentation fault" ou "violation d'accès" si vous essayez de le faire, ce qui sera presque toujours le résultat de votre programme étant terminé par le système d'exploitation. Voici une façon un pointeur null peut être déréférencé:
Et oui, un déréférencement d'un pointeur null est à peu près exactement comme un
NullReferenceException
en C# (ou unNullPointerException
en Java), sauf que la langue standard est un peu plus utile ici. En C#, un déréférencement d'une référence null a bien défini comportement: il jette toujours unNullReferenceException
. Il n'y a aucun moyen pour que votre programme puisse continuer à travailler en mode silencieux ou effacer votre disque dur comme en C (sauf si il y a un bug dans la langue de l'exécution, mais encore une fois c'est incroyablement peu probable que bien).Cela signifie
en gros, presque tout ce qui a trait
(*p)
ou implicitement impliquant(*p)
, par exemplep->...
qui est une abréviation pour(*p). ...
; sauf pour la déclaration de pointeur.p->meth()
juste un raccourci pour(*p).meth()
, ce dernier étant disponible en C et C++?De wiki
Citant wikipédia:
Déréférencement est fait par l'application de la
unary *
opérateur sur le pointeur."Déréférencement d'un pointeur NULL" désigne le fait d'
*p
lorsque lep
estNULL