Sur l'une des «plates-formes majeures» (que je définis comme Windows, Mac et Linux pour cette question), est-il concevable qu'un pointeur valablement alloué soit alloué à l'adresse 0 dans un espace d'adressage de programme (est-ce que le fait d'ajouter des comparaisons à NULL?) Est-ce que la norme permet même à un compilateur/plate-forme d'avoir une allocation valide à l'adresse 0?Un pointeur valide peut-il être alloué à l'adresse 0?
Répondre
La norme C++ le permet, mais un tel pointeur ne sera pas comparable au littéral 0
(la constante du pointeur NULL).
Les applications en mode utilisateur dans les principaux systèmes d'exploitation, cependant, n'auront jamais de pointeur valide à 0, ni même dans la plage -65536 à 65535 (pour aider à détecter les décalages d'un pointeur NULL).
Pour la plupart, 0
comme une adresse utilisable existe seulement dans les systèmes embarqués, et très rarement dans les noyaux des systèmes d'exploitation PC. Mais les systèmes de mémoire virtuelle le réservent, sans aucune exception dont j'ai jamais entendu parler.
Le NULL
-pointer (ou plutôt: le jeton 0
dans un contexte où un pointeur est nécessaire) ne signifie pas nécessairement l'adresse 0
, mais une adresse qui est connue pour être valide sur cette plate-forme. Les comparaisons avec le pointeur null sont donc sûres, en supposant un compilateur compatible.
Ne pas alterner les valeurs pour NULL sur différentes plates-formes provoquer des problèmes avec le pointeur vers bool cast, par exemple l'initialisation d'un pointeur sur NULL, puis faire un 'if (some_ptr)' pour vérifier si son valide? – 0x5f3759df
'if (some_ptr)' est équivalent à 'if (some_ptr! = 0)', donc je ne pense pas que ce soit un problème. –
@hex: Non, car C++ spécifie qu'une conversion de pointeur en bool est fausse si et seulement si le pointeur est nul. – aschepler
- 1. Pointeur non alloué Objective-C
- 2. Comment vérifier si un pointeur est valide?
- 3. Quand libérer un pointeur pthread_t dynamiquement alloué en C?
- 4. Comment tester si un pointeur parent a été alloué?
- 5. windows PID = 0 valide?
- 6. pointeur à un problème de syntaxe pointeur
- 7. test si strstr retourner un pointeur valide
- 8. iPhone setDelegate à un objet précédemment alloué
- 9. Est-ce de mauvaises manières de renvoyer un pointeur alloué par tas à partir d'une fonction?
- 10. pointeur déréférencement à un pointeur
- 11. Pointeur vers un pointeur pointant vers un bloc de mémoire, quel pointeur doit être libéré?
- 12. Décalage non valide '0' erreur
- 13. test de pointeur valide en C++
- 14. accès non valide du pointeur (lecture 4 octets de 0 * 1) Erreur de PREfast
- 15. Un pointeur peut-il être converti en pointeur vide?
- 16. Passant un pointeur par référence valide pour getadrinfo en C++
- 17. Pourquoi est-ce que j'obtiens EXC_BAD_ACCESS même si le pointeur semble être valide?
- 18. pointeur vers un pointeur par rapport à un pointeur
- 19. Interconversion pointeur à pointeur
- 20. PHP instruction if ne valide sur "== 0!"
- 21. ** *** glibc détectée libre(): pointeur non valide: 0x0000000000400b2c
- 22. Un objet Ruby alloué dans une extension C peut-il être récolté à tout moment?
- 23. Pourquoi pointer un pointeur sur 0 après l'avoir effacé?
- 24. code de réponse HTTP non valide '0'
- 25. est -1 une adresse de pointeur valide
- 26. Comment obtenir un UserControl à étirer pour remplir l'espace alloué?
- 27. pas égal à 0 vérifie non null sur le pointeur?
- 28. Est-il bon d'envoyer un objet alloué à la pile en tant que paramètre pointeur à une autre fonction?
- 29. ADO _Recordset Objet: pointeur non valide étrange
- 30. 0 pas valide FILE * lorsque fourni en argument de modèle
L'accès au pointeur NULL est un problème si important qu'un petit espace de mémoire de réserve microsoft incorporé 0 permet de détecter l'accès au pointeur NULL et d'émettre une interruption matérielle lors de l'accès. Un sur lequel j'ai travaillé avait une LED sur l'émulateur matériel qui est entré lorsque l'adresse 0 a été accédé. – mattnz