c les pointeurs - avertissement pour le format '%x' attend des arguments du type "unsigned int"
Je suis en train de lire le Piratage de l'art de l'exploitation et il est un exemple là-bas que je n'arrive pas à obtenir correct. Tentez de compiler les résultats dans l'erreur:
./addressof.c: In function ‘main’:
./addressof.c:8:4: warning: format ‘%x’ expects argument of type ‘unsigned int’,
but argument 2 has type ‘int *’ [-Wformat]
#include <stdio.h>
int main() {
int int_var = 5;
int *int_ptr;
int_ptr = &int_var; //Put the address of int_var into int_ptr.
printf("int_ptr = 0x%08x\n", int_ptr);
printf("&int_ptr = 0x%08x\n", &int_ptr);
printf("*int_ptr = 0x%08x\n\n", *int_ptr);
printf("int_var is located at 0x%08x and contains %d\n", &int_var, int_var);
printf("int_ptr is located at 0x%08x, contains 0x%08x, and points to %d\n\n",
&int_ptr, int_ptr, *int_ptr);
}
Je comprends d'où l'erreur est, je ne sais pas comment résoudre ce problème.
Vous devez vous connecter pour publier un commentaire.
Le spécificateur de format pour le pointeur est
%p
, pas%x
. (Voir ici)*int_ptr
(qui est unint
) à l'aide de la%p
spécificateur de format.int_ptr
et&int_ptr
sont des pointeurs, et doivent être imprimés à l'aide de%p
, mais le valeur que le pointeur pointe vers est un entier, et doivent être imprimés à l'aide de%d
printf
:printf("%p", (void*)(&x));
. Différents types de pointeur ne sont pas disposés de la même façon, mais ils est la garantie d'être convertibles sans perte devoid*
.%8p
au lieu de%08p
(Le zéro n'est pas pris en charge pour le spécificateur dep
).