Что надлежащее использование printf должно отобразить указатели, дополненные 0s

Я использую часть программного обеспечения, названного Navicat к:

  • базы данных Sync Live к моим тестовым базам данных.
  • Выставочные различия между этими двумя базами данных.

Это стоит денег, это - окна и Mac только, и это имеет эксцентричный UI, но мне нравится он.

41
задан 10 August 2009 в 14:08
поделиться

6 ответов

#include

#include

printf ("% 016" PRIxPTR "\ n", (uintptr_t) ptr);

, но он не будет печатать указатель способом, определенным в реализации (говорит DEAD: BEEF для сегментированного режима 8086).

38
ответ дан 27 November 2019 в 00:49
поделиться

Используйте:

#include <inttypes.h>

printf("0x%016" PRIXPTR "\n", (uintptr_t) pointer);

Или используйте другой вариант макроса из этого заголовка.

Также обратите внимание, что некоторые реализации printf () печатают ' 0x 'перед указателем; другие нет (и оба верны в соответствии со стандартом C).

8
ответ дан 27 November 2019 в 00:49
поделиться

Это легко решить, если привести указатель к длинному типу. Проблема в том, что это не будет работать на всех платформах, поскольку предполагается, что указатель может уместиться внутри long, и что указатель может отображаться в 16 символах (64 бита). Однако это верно для большинства платформ.

так что это будет выглядеть следующим образом:

printf("%016lx", (unsigned long) ptr);
0
ответ дан 27 November 2019 в 00:49
поделиться

Как уже сказано в вашей ссылке, поведение не определено. Я не думаю, что есть переносимый способ сделать это, поскольку% p сам зависит от платформы, на которой вы работаете. Конечно, вы можете просто указать указатель на int и отобразить его в шестнадцатеричном формате:

printf("0x%016lx", (unsigned long)ptr);
0
ответ дан 27 November 2019 в 00:49
поделиться

Может быть, это будет интересно (на 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 и приведений (приведения типов и спецификатора формата очень непереносимо) используются только нули.

0
ответ дан 27 November 2019 в 00:49
поделиться

Я обычно использую% x для отображения указателей. Я полагаю, что это не переносимо на 64-битные системы, но отлично работает для 32-битных.

Мне будет интересно узнать, какие ответы есть для переносимых решений , поскольку представление указателя не является не совсем портативный.

-1
ответ дан 27 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: