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 .