fprint против fprintf в c - PullRequest
       8

fprint против fprintf в c

0 голосов
/ 08 января 2019

Я могу скомпилировать и выполнить эту строку без проблем:

int whoami = i->whoami;
uint8_t * fetchPTR = &in[dataSize];
printf("%d, init fetch ptr = %08X\n",whoami, fetchPTR);

Однако, используя fprintf Я получаю это предупреждение:

warning: format specifies type 'unsigned int' but the argument has type 'uint8_t *' (aka 'unsigned char *') [-Wformat]

и предлагает мне использовать %s.

Кто-нибудь может объяснить это поведение?

1 Ответ

0 голосов
/ 08 января 2019

%X строго соответствует размеру unsigned int, поэтому на любой машине, где sizeof unsigned int != sizeof uint8_t* (например, на большинстве 64-битных машин), он не будет печатать полное значение указателя. Код формата %p будет печатать указатели с правильно указанным размером указателя, поэтому используйте его для печати адресов памяти.

Чтобы было ясно, как отмечено в комментариях ниже, это фактически неопределенное поведение, даже когда sizeof unsigned int == sizeof uint8_t*; Я знаю, что указатели хранятся целочисленными способами на всех современных аппаратных средствах, но какая-то будущая система может нарушить эту эквивалентность, и соблюдение стандарта языка - единственный способ гарантировать переносимость. Точно так же, чтобы быть полностью совместимым, вы должны привести указатель к void*, чтобы напечатать , поскольку %p специально работает с void*, а не с «указателями в целом»; в странных системах (например, в системах с сегментированной памятью с концепцией ближних и дальних указателей или в отдельных пространствах памяти для разных типов указателей) uint8_t* и void* могут быть не эквивалентны тому, как они хранятся или представляются, но приводятся к void* всегда должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...