58 votes

Où `% p` est-il utile avec printf?

Après tout, ces deux déclarations font 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 formater le pointeur comme vous le souhaitez avec %x , existe-t-il un bon usage de l'option %p ?

126voto

Peter Hosey Points 66275

Ils ne font pas la même chose. Le dernier printf déclaration interprète b comme unsigned int, ce qui est faux, comme b est un pointeur.

Les pointeurs et l' unsigned ints 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 commun) %x permettra d'imprimer seulement la moitié de l'adresse. Sur un Mac (et probablement quelques autres systèmes), qui sera la ruine de l'adresse; le résultat sera mauvais.

Toujours utiliser %p pour les pointeurs.

8voto

unwind Points 181987

Au moins sur un système qui n’est pas très rare, ils n’impriment pas la même chose:

 ~/src> uname -m
i686
~/src> gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
[some output snipped]
gcc version 4.1.2 (Gentoo 4.1.2)
~/src> gcc -o printfptr printfptr.c
~/src> ./printfptr
0xbf8ce99c
bf8ce99c
 

Notez que la version du pointeur ajoute un préfixe 0x , par exemple. Utilisez toujours% p car il connaît la taille des pointeurs et la meilleure façon de les représenter sous forme de texte.

5voto

Mauritius Points 31

Vous ne pouvez pas compter sur "% p" pour afficher un préfixe "0x". Sur Visual C ++, ce n'est pas le cas. Utilisez "% # p" pour être portable.

4voto

Tronic Points 6457

La taille du pointeur peut être différente de celle de int. De plus, une implémentation peut produire mieux qu'une simple représentation hexadécimale de l'adresse lorsque vous utilisez% p.

2voto

Filip Ekberg Points 22189

x est un entier hexadécimal non signé (32 bits)

p est l'adresse du pointeur

Voir printf dans la référence C ++ . Même si les deux écrivent la même chose, j'utiliserais %p pour imprimer un pointeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X