Где '%p' полезный с printf?

В конце концов, оба этих оператора делают то же самое...

int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);

Например (с различными адресами):

0012FEE0
0012FEE0

Это тривиально для форматирования указателя, как желаемый с %x, так есть ли некоторое хорошее использование %p опция?

57
задан Synetech 30 March 2012 в 19:35
поделиться

5 ответов

Они не делают то же самое. Последний оператор printf интерпретирует b как unsigned int , что неверно, поскольку b является указателем.

Указатели и unsigned int не всегда имеют одинаковый размер, поэтому они не взаимозаменяемы. Если они не одинакового размера (что становится все более распространенным, поскольку 64-разрядные процессоры и операционные системы становятся все более распространенными), % x будет печатать только половину адреса. На Mac (и, возможно, в некоторых других системах) испортит адрес; вывод будет неправильным.

Всегда используйте % p для указателей.

124
ответ дан 24 November 2019 в 19:24
поделиться

Размер указателя может отличаться от размера int . Кроме того, при использовании % p реализация может дать лучшее представление адреса, чем простое шестнадцатеричное значение.

4
ответ дан 24 November 2019 в 19:24
поделиться

x - шестнадцатеричное целое без знака (32 бита).

p - адрес указателя

См. printf в Справочнике по C ++ . Даже если бы они оба написали одно и то же, я бы использовал % p для печати указателя.

2
ответ дан 24 November 2019 в 19:24
поделиться

x используется для вывода аргумента указателя t в шестнадцатеричном формате.

Типичный адрес при печати с использованием % x будет выглядеть как bfffc6e4 , а нормальный адрес, напечатанный с использованием % p , будет 0xbfffc6e4

-2
ответ дан 24 November 2019 в 19:24
поделиться

По крайней мере, на одной системе, что не так уж редко встречается, они печатаются по-разному:

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

Обратите внимание, что версия указателя добавляет префикс 0x, например. Всегда используйте %p, поскольку он знает о размере указателей и о том, как лучше представить их в виде текста.

8
ответ дан 24 November 2019 в 19:24
поделиться