2011-07-12 1 views
4

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

7

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.

+2

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

2

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.

+0

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

+0

'if (some_ptr)' est équivalent à 'if (some_ptr! = 0)', donc je ne pense pas que ce soit un problème. –

+0

@hex: Non, car C++ spécifie qu'une conversion de pointeur en bool est fausse si et seulement si le pointeur est nul. – aschepler

Questions connexes