Adresse de (&) donne l’adresse générée par le compilateur ou l’adresse générée par le chargeur?

int a; printf("address is %u", &a); 

Quelle adresse est-ce ..? Je veux dire s’agit-il d’une adresse générée par le compilateur, c’est-à-dire une adresse virtuelle ou le chargeur donné à une adresse physique dans la RAM …?

Comme il imprime une adresse différente à chaque fois, je suppose que cela doit être adresse dans la RAM. Juste pour être sûr.

Veuillez fournir des liens qui renvoient à votre réponse.

La réponse correcte est: “ça dépend.”

(Printf doit utiliser la directive “% p” et convertir l’adresse en “void *”, pour des raisons bien définies:

 printf("%p\n", (void *)&a); 

Bien que l’utilisation de% u fonctionne sans aucun doute pour votre compilateur avec tous les drapeaux que vous utilisez.)

Comme @Alex l’a noté, l’adresse est virtuelle si la traduction est en cours (comme avec la plupart des systèmes d’exploitation modernes, ou même lors de l’exécution en mode “physique émulé” sous une machine virtuelle). L’adresse elle-même est généralement déterminée au moment du lien ou du chargement si “a” a une durée de stockage statique, mais au moment de l’exécution (sur la stack, comme le dit @Als) sinon. Les variables déclarées “statiques” ou “extern” ont une durée statique; les variables déclarées en dehors des corps de fonction ont une durée statique; et les variables déclarées dans les corps de fonction, mais sans utiliser ni “extern” ni “static”, ont une durée de stockage automatique (et sont donc généralement sur “la stack” – bien qu’il puisse y avoir plus d’une stack, comme lors de l’utilisation de threads POSIX).

L’adresse renvoyée pour une variable locale dans l’espace utilisateur est toujours une adresse virtuelle et non une adresse physique.

La variable a dans votre cas est allouée sur le stockage local (stack) et chaque fois que vous exécutez votre programme, un espace de stack alloué à votre fonction, la variable est située à un décalage particulier dans ce cadre de stack, car l’adresse de la stack étant allouée votre programme peut être différent à chaque fois que l’adresse renvoyée pour la variable sera également différente.

Sur tout système d’exploitation moderne, toutes les adresses visibles au niveau C sont des adresses virtuelles. L’exemple que vous donnez est une variable de la stack, et la raison pour laquelle cela serait différent à chaque exécution est que l’adresse de la stack (virtuelle) est randomisée pour des raisons de sécurité.

Quoi qu’il en soit, même les symboles globaux résolus par le chargeur ont des adresses virtuelles dans l’espace d’adressage du processus.

(Tout cela peut ne pas être vrai pour les périphériques intégrés, mais ce n’est généralement rien que vous rencontrerez en apprenant C)

Je veux dire, c’est une adresse générée par le compilateur, c’est-à-dire une adresse virtuelle ou le chargeur donné à une adresse physique dans la RAM.

Fausse dichotomie L’adresse générée par le compilateur est déplacée par l’éditeur de liens et c’est cette adresse qui est renvoyée par &. Il s’agit d’une adresse virtuelle, à moins que vous n’exécutiez une tâche étrange, telle que NetWare 3, qui n’utilise pas de machine virtuelle.