Où est - `%p` utile avec printf?
Après tout, ces deux déclarations de faire la même chose...
int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
Par exemple (avec des adresses différentes):
0012FEE0
0012FEE0
Il est trivial de format le pointeur comme vous le souhaitez, avec %x
, donc est-il un bon usage de la %p
option?
- En utilisant '%p' vous imprimer l'adresse de la variable en question, "Le pointeur void * argument est imprimé en hexadécimal (comme par %#x ou %#lx)."
- En C++, vous pouvez utiliser (void *) transtypage: voir stackoverflow.com/questions/5657123/...
Vous devez vous connecter pour publier un commentaire.
Ils ne font pas la même chose. Le dernier
printf
déclaration interprèteb
comme ununsigned int
, ce qui est faux, commeb
est un pointeur.Pointeurs et
unsigned int
s ne sont pas toujours de la même taille, de sorte que ces ne sont pas interchangeables. Quand ils ne sont pas de la même taille (de plus en plus souvent le cas, que les Cpu 64 bits et les systèmes d'exploitation deviennent plus courantes),%x
permettra d'imprimer seulement la moitié de l'adresse. Sur un Mac (et probablement quelques autres systèmes), qui sera de la ruine de l'adresse; le résultat sera mauvais.Toujours utiliser
%p
pour les pointeurs.b
àvoid *
avec le%p
format - c'est l'un des rares cas en C où l'on a besoin d'un plâtre.-Wextra
drapeau, vous obtiendrez des mises en garde appropriées pour mauvaise types deprintf
. Pour faire la mise en garde d'aller plus loin, vous devez utiliser la forme correcte et la fonte devoid*
qui peut être utile.Au moins sur un système qui n'est pas très rare, ils n'impriment pas la même:
Le pointeur version ajoute un
0x
préfixe, par exemple. Toujours utiliser le %de p, car il sait au sujet de la taille des pointeurs, et la meilleure façon de les représenter sous forme de texte.Vous ne pouvez pas dépendre
%p
l'affichage d'un0x
préfixe. Sur Visual C++, il ne le fait pas. Utilisation%#p
pour être portable.La taille du pointeur de la souris peut être quelque chose de différent que celui de
int
. Aussi une mise en œuvre peut produire de mieux que de la simple valeur hexadécimale de la représentation de l'adresse lorsque vous utilisez%p
.x
est entier hexadécimal non signé ( 32 Bits )p
est l'adresse de PointeurVoir printf sur le C++ de Référence. Même si les deux d'entre eux serait d'écrire la même chose, je voudrais utiliser
%p
pour imprimer un pointeur.use %p to print a pointer
. De toute façon, Peter Hosey la réponse de réponses à mes doutes.Lorsque vous avez besoin de débogage, utilisez printf avec
%p
option est très utile. Vous voyez 0x0 lorsque vous avez une valeur NULL.(nil)
-- y compris les parenthèses. Il semble y avoir beaucoup de mise en œuvre spécifique de la variation dans%p
x
est utilisée pour l'impression de t argument pointeur en hexadécimal.Une adresse typique lors de l'impression à l'aide de
%x
ressembleraitbfffc6e4
et sain adresse imprimée à l'aide de%p
serait0xbfffc6e4
%x
est utilisée pour imprimer d'une valeur de typeunsigned int
en hexadécimal. Il n'y a absolument aucune garantie queunsigned int
est de la même taille quevoid *
, et c'est une mauvaise idée de supposer donc dans le code.