2012-05-15 1 views

Répondre

5

i est sur la pile, tandis que le morceau de mémoire vers lequel il pointe est dans le tas. Sur votre plate-forme ce sont deux domaines très différents de la mémoire et il arrive juste si le addess tas est relativement faible, numériquement, il a beaucoup de zéros non significatifs qui ne sont pas représentés, à savoir

&i = 0x7fff38fed6a8; // stack 
i = 0x0000010f7010; // heap 
1

Il n'est pas nécessaire que le spécificateur de formatage %p place la sortie à une longueur fixe. Vous ne pouvez donc pas déduire des informations sur la "longueur" en mémoire d'une adresse à partir de la représentation imprimée. Par exemple, si vous faites ceci:

const void *nada = NULL; 

printf("NULL is at %p\n", nada); 

Vous pourriez bien voir quelque chose comme ceci:

NULL is at 0x0 

Bien sûr, cela ne signifie pas que le type void * occupe par magie seulement 4 bits lorsque les La valeur est NULL, cela signifie simplement que lorsque la valeur du pointeur a été convertie en chaîne, les zéros en tête ont été omis.

MISE À JOUR: Mis en erreur le code de la question, j'ai supprimé le texte non pertinent.

+0

@PaulR: D'oh, mal lire le code de la question. Merci, et corrigé! – unwind

4

i est une adresse sur le tas, tandis que &i est une adresse sur la pile. Le tas et la pile occupent différentes plages d'adresses, de sorte que vous voyez des nombres différents.

Les pointeurs ne sont pas réellement des longueurs différentes: la plus courte est précédée de zéros. Vous exécutez probablement cela sur une machine 64 bits, donc chaque pointeur a 64 bits (16 chiffres hexadécimaux).

1

Ce n'est pas plus court, juste le nombre est plus petit. Pointer & Je suis sur la pile et je suis sur le tas.

1

En plus de la d'autres réponses:

Puisque vous n'avez pas inclus <stdlib.h> il y a une bonne chance que le compilateur suppose à tort que les rendements malloc int plutôt que void*. C'est un bug potentiellement grave, que vous avez caché avec la valeur de retour de malloc. Lire this et this. Si int a une largeur différente de celle du bus d'adresse sur votre système spécifique, par exemple sur de nombreuses CPU 16 bits ou 64 bits, vous obtiendrez des résultats incorrects.

Questions connexes