Я использую часть программного обеспечения, названного Navicat к:
Это стоит денег, это - окна и Mac только, и это имеет эксцентричный UI, но мне нравится он.
#include
#include
printf ("% 016" PRIxPTR "\ n", (uintptr_t) ptr);
, но он не будет печатать указатель способом, определенным в реализации (говорит DEAD: BEEF
для сегментированного режима 8086).
Используйте:
#include <inttypes.h>
printf("0x%016" PRIXPTR "\n", (uintptr_t) pointer);
Или используйте другой вариант макроса из этого заголовка.
Также обратите внимание, что некоторые реализации printf ()
печатают ' 0x
'перед указателем; другие нет (и оба верны в соответствии со стандартом C).
Это легко решить, если привести указатель к длинному типу. Проблема в том, что это не будет работать на всех платформах, поскольку предполагается, что указатель может уместиться внутри long, и что указатель может отображаться в 16 символах (64 бита). Однако это верно для большинства платформ.
так что это будет выглядеть следующим образом:
printf("%016lx", (unsigned long) ptr);
Как уже сказано в вашей ссылке, поведение не определено. Я не думаю, что есть переносимый способ сделать это, поскольку% p сам зависит от платформы, на которой вы работаете. Конечно, вы можете просто указать указатель на int и отобразить его в шестнадцатеричном формате:
printf("0x%016lx", (unsigned long)ptr);
Может быть, это будет интересно (на 32-битной машине с Windows, используя mingw):
rjeq@RJEQXPD /u
$ cat test.c
#include <stdio.h>
int main()
{
char c;
printf("p: %016p\n", &c);
printf("x: %016llx\n", (unsigned long long) (unsigned long) &c);
return 0;
}
rjeq@RJEQXPD /u
$ gcc -Wall -o test test.c
test.c: In function `main':
test.c:7: warning: `0' flag used with `%p' printf format
rjeq@RJEQXPD /u
$ ./test.exe
p: 0022FF77
x: 000000000022ff77
Как видите, версия% p заполняет нулями до размера указателя, а затем пробелы до указанного размера, тогда как при использовании% x и приведений (приведения типов и спецификатора формата очень непереносимо) используются только нули.
Я обычно использую% x для отображения указателей. Я полагаю, что это не переносимо на 64-битные системы, но отлично работает для 32-битных.
Мне будет интересно узнать, какие ответы есть для переносимых решений , поскольку представление указателя не является не совсем портативный.