web-dev-qa-db-fra.com

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 différentes adresses):

0012FEE0
0012FEE0

Il est trivial de formater le pointeur comme vous le souhaitez avec %x, y a-t-il donc une bonne utilisation du %p option?

56
Moeb

Ils ne font pas la même chose. Cette dernière instruction printf interprète b comme un unsigned int, ce qui est faux, car b est un pointeur.

Pointeurs et unsigned ints ne sont pas toujours de la même taille, ils ne sont donc pas interchangeables. Quand ils ne sont pas de la même taille (un cas de plus en plus courant, car les processeurs 64 bits et les systèmes d'exploitation deviennent plus courants), %x n'imprimera que la moitié de l'adresse. Sur un Mac (et probablement certains autres systèmes), cela ruinera l'adresse; la sortie sera fausse.

Utilisez toujours %p pour les pointeurs.

123
Peter Hosey

Au moins sur un système qui n'est pas très rare, ils n'impriment pas de la même façon:

~/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

Remarquez comment la version du pointeur ajoute un 0x préfixe, 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.

8
unwind

Vous ne pouvez pas dépendre de %p affichant un 0x préfixe. Sur Visual C++, ce n'est pas le cas. Utilisation %#p pour être portable.

5
Mauritius

La taille du pointeur peut être différente de celle de int. Une implémentation peut également produire une représentation de l'adresse hexadécimale meilleure que la simple lorsque vous utilisez %p.

4
Tronic

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

p est l'adresse du pointeur

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

2
Filip Ekberg

Lorsque vous devez déboguer, utiliser printf avec l'option %p Est vraiment utile. Vous voyez 0x0 lorsque vous avez une valeur NULL.

0
albttx