imprimer l’emplacement mémoire d’une variable (ou d’un pointeur)

Je veux imprimer où une variable est stockée. Je Google et j’ai trouvé ceci:

int *p; printf("memory location of ptr: %p\n", (void *)p); 

Si j’écris ceci, est-ce vrai?

 printf("memory location of ptr: %p\n", &p); 

Je l’ai compilé et je ne reçois aucune erreur ni aucun avertissement, mais ces deux déclarations ne renvoient pas la même valeur si je les mets toutes les deux dans le programme.

Disons que vous avez ces déclarations:

 int i; int *p = &i; 

Cela ressemblerait à quelque chose comme ça en mémoire:

 + --- + + --- +
 |  p |  -> |  i |
 + --- + + --- +

Si vous utilisez ensuite &p vous obtenez un pointeur sur p , vous avez donc ceci:

 + ---- + + --- + + --- +
 |  & p |  -> |  p |  -> |  i |
 + ---- + + --- + + --- +

Donc, la valeur de p est l’adresse de i , et la valeur de &p est l’adresse de p . C’est pourquoi vous obtenez des valeurs différentes.

si j’écris ceci, est-ce correct?

Non, ce n’est pas juste. Pour le spécificateur %p vous devez le convertir en void * . Votre compilateur devrait donner un avertissement à ce sujet:

 warning: format '%p' expects argument of type 'void *', but argument 2 has type 'int **' [-Werror=format=] 

Lisez cette réponse . Il dit que:

Le format %p nécessite un argument de type void* . Si les pointeurs de type int* et int(*)[10] ont la même représentation que void* et sont passés comme arguments de la même manière, comme c’est le cas pour la plupart des implémentations, cela fonctionnera probablement, mais ce n’est pas garanti. Vous devriez explicitement convertir les pointeurs en void*

Draft n1570; 7.21.6 Fonctions d’entrée / sortie formatées:

p L’argument doit être un pointeur sur void . La valeur du pointeur est convertie en une séquence de caractères d’impression, d’une manière définie par l’implémentation.


mais ces deux déclarations ne retournent pas la même valeur si je les mets toutes les deux dans le programme.

Oui, il ne retournera pas la même valeur. P vous donnera la valeur d’adresse de la variable p pointe sur (pointee) tandis que &p vous donnera la valeur de l’adresse du pointeur p lui-même. Cast &p pour void * .

 printf("memory location of ptr: %p\n", (void *)&p); 

Si vous utilisez l’opérateur “&” sur un pointeur, vous créez un pointeur sur le pointeur. Le résultat dans votre cas serait donc un int **.

printf attend un vide * lorsque vous utilisez le spécificateur% p, le premier moyen est donc correct.

Comme vous l’avez découvert, les deux ne font pas la même chose.

Le premier imprimera la valeur stockée dans p . Vous vous attendriez généralement à ce que ce soit l’adresse d’un int (même si les gens font les choses les plus maudites).

La seconde affichera l’adresse de p . Cependant, vous devez append un casting à void * pour des raisons de portabilité. La seconde doit donc se lire:

 printf("memory location of ptr: %p\n", (void *)&p); 

Je veux imprimer où une variable est stockée.

Donc, la réponse à votre question dépend de quelle variable vous êtes concerné? Pour les int , p indique que vous voulez utiliser le premier. Pour la variable p elle-même, vous voulez utiliser la seconde.

 #include  int main() { int i; int *x = &i; i = 8; printf("value of i is %d\n",i); printf("value of x is %d\n", *x); printf("address of x is %p\n",x); printf("address of i is %p\n",&i); } 

sortie:

~ / workspace / C $ ./test

la valeur de i est 8

la valeur de x est 8

adresse de x est 0x7fff793b09c4

adresse de i est 0x7fff793b09c4