Un pointeur pointant vers 0x0000 est-il identique à un pointeur défini sur NULL? Si la valeur NULL est définie dans le langage C, à quel emplacement se traduit-elle physiquement? Est-ce la même chose que 0x0000. Où puis-je trouver plus de détails sur ces concepts?
12
Réponses:
Un point que la plupart des réponses ici ne traitent pas, du moins pas explicitement, est qu'un pointeur nul est une valeur qui existe pendant l'exécution, et une constante de pointeur nul est une construction syntaxique qui existe dans le code source C.
Une constante de pointeur nul , comme l'indique correctement la réponse de Karlson, est soit une expression de constante entière avec la valeur 0 (un simple
0
est l'exemple le plus courant), soit une telle expression transtypée envoid*
(telle que(void*)0
).NULL
est une macro, définie dans<stddef.h>
et plusieurs autres en-têtes standard, qui se développe en une constante de pointeur nul définie par l'implémentation . L'expansion est généralement soit0
ou((void*)0)
(les parenthèses externes sont nécessaires pour satisfaire les autres règles de langage).Ainsi, un littéral
0
, lorsqu'il est utilisé dans un contexte qui nécessite une expression de type pointeur, est toujours évalué à unenull pointer
, c'est-à-dire une valeur de pointeur unique qui ne pointe vers aucun objet. Cela ne n'implique rien au sujet de la représentation d'un pointeur NULL . Les pointeurs nuls sont très souvent représentés sous forme de bits zéro, mais ils peuvent être représentés comme n'importe quoi. Mais même si un pointeur nul est représenté par , ou est toujours une constante de pointeur nul .0xDEADBEEF
0
(void*)0
Cette réponse à la question sur stackoverflow couvre bien cela.
Cela implique, entre autres, que
memset()
oucalloc()
, qui peut définir une région de mémoire sur tous les bits à zéro, ne définira pas nécessairement les pointeurs de cette région sur des pointeurs nuls. Ils sont susceptibles de le faire sur la plupart des implémentations, mais le langage ne le garantit pas.Je ne sais pas pourquoi cette question n'est pas considérée comme un double de celle-ci , ni comment elle est d'actualité ici.
la source
NULL
, ou toute constante de pointeur nul , à un objet pointeur définit la valeur de cet objet sur un pointeur nul . Au niveau de la machine, cela peut bien indiquer un morceau de mémoire valide. Déréférencer un pointeur nul a un comportement indéfini; accéder à un morceau de mémoire à l'adresse0x0000000
est un comportement valide, comme c'est littéralement toute autre chose. Cette adresse diffère de toute autre adresse par (a) une comparaison égale àNULL
, et (b) une comparaison inégale à tout pointeur vers un objet C. Un pointeur nul est une valeur de pointeur arbitraire utilisée pour indiquer qu'il ne pointe vers rien.Chaque plate-forme est libre de définir NULL à sa guise.
Selon la norme C, si vous affectez zéro à un pointeur, il sera converti en valeur NULL (pour cette plate-forme). Cependant, si vous prenez un pointeur NULL et le transformez en entier, rien ne garantit que vous obtiendrez zéro sur chaque plate-forme là-bas. Le fait est cependant que sur la plupart des plateformes, il sera nul.
Informations sur ce genre de choses que vous pouvez trouver dans le langage C Spécification . Une source, dont je ne peux pas garantir la fiabilité, est la suivante: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf
la source
NULL pointer constant
. Pour autant que je sache, il n'y a pas de compilateurs qui font cela.NULL
macro, qui doit étendre à0
en C ++ et soit0
ou(void *)0
en C, parce que c'est la vraie "constante de pointeur nul".Il est défini dans le langage C car il n'y a aucune adresse de machine invariante à laquelle il correspond. Si c'était le cas, nous n'aurions pas besoin d'une abstraction! Même si sur la plupart des plates-formes, NULL peut éventuellement être implémenté en tant que 0 d'un type ou d'un autre, il est tout simplement faux de supposer qu'il en est ainsi universellement, si vous vous souciez de la portabilité.
la source
Selon la section du document standard C
6.3.2.3
:Jusqu'à présent, je n'ai pas vu de compilateur qui en soit sorti.
la source