2009-08-24 5 views

Répondre

11

Vous posez des questions sur les pointeurs en général?

Sur la plupart des systèmes d'exploitation, ce sont des adresses logiques.

Le système d'exploitation est chargé de les traduire en adresses physiques via le mécanisme de mémoire virtuelle et de pagination. Ceci est transparent pour le programme. C'est pourquoi un programme malavisé "frappe les limites" et les GPF.

Sur certains anciens systèmes (par exemple, DOS), ils seraient physiques, vous permettant d'écraser des éléments dans d'autres parties de la mémoire.

7

Dépend du système d'exploitation et du niveau d'exécution de votre code.

Pour un programme utilisateur-terrain normal sur un système d'exploitation moderne, vous obtiendrez l'adresse virtuelle.

+1

mais si je cours le prog suivant: int main() {int (* p)(); p = main; printf ("% p", p);} il donne l'adresse comme 0x80483c4, il pense que c'est l'adresse physique, pourquoi l'adresse virtuelle de la main principale à une telle adresse? Je cours cela sur linux.plz clarifier si je me trompe ?? – mawia

+4

Vous avez tort. C'est une adresse virtuelle. Personne n'a dit que votre fonction main() est chargée à l'adresse virtuelle 0. En fait, par défaut dans les binaires ELF (utilisés dans linux) le segment de code commence à l'adresse virtuelle 0x80482c0, ce qui semble à peu près correct (il y a une configuration cachée) code avant principal()). Gardez à l'esprit que l'espace d'adressage virtuel est souvent non contigu et que les adresses virtuelles ne sont allouées que lorsque vous les utilisez. Juste parce que votre programme est chargé à 0x80482c0 ne signifie pas que tout ce qui existe entre là et 0x0 a déjà été alloué. –

+0

Si vous souhaitez vraiment savoir comment votre programme est organisé en mémoire sous Linux, lisez ceci: http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html –

Questions connexes