Comment imprimer une adresse mémoire en C

Mon code est:

#include  #include  void main() { char ssortingng[10]; int A = -73; unsigned int B = 31337; strcpy(ssortingng, "sample"); // printing with different formats printf("[A] Dec: %d, Hex: %x, Unsigned: %u\n", A,A,A); printf("[B] Dec: %d, Hex: %x, Unsigned: %u\n", B,B,B); printf("[field width on B] 3: '%3u', 10: '%10u', '%08u'\n", B,B,B); // Example of unary address operator (dereferencing) and a %x // format ssortingng printf("variable A is at address: %08x\n", &A); 

J’utilise le terminal sous Linux Mint pour comstackr, et lorsque j’essaie de comstackr avec gcc, le message d’erreur suivant s’affiche:

 basicSsortingngFormatting.c: In function 'main': basicSsortingngFormatting.c:18:2: warning: format '%x' expects argument of type 'unsigned int', but argument 2 has type 'int *' [-Wformat=] printf("variable A is at address: %08x\n", &A); 

Tout ce que j’essaie de faire est d’imprimer l’adresse en mémoire de la variable A.

Utilisez le spécificateur de format %p :

 printf("variable A is at address: %p\n", (void*)&A); 

La norme exige que l’argument soit du type void* pour le spécificateur %p . Puisque printf est une fonction variadique, il n’ya pas de conversion implicite en void * de T * qui se produirait de manière implicite pour toute fonction non variadique en C. Par conséquent, la conversion est nécessaire. Pour citer le standard:

7.21.6 Fonctions d’entrée / sortie formatées (brouillon C11)

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.

Alors que vous utilisez %x , qui attend unsigned int alors que &A est du type int * . Vous pouvez en savoir plus sur les spécificateurs de format pour printf dans le manuel . Une incompatibilité de spécificateur de format dans printf entraîne un comportement indéfini .