Есть ли случай, когда спецификатор формата%p не будет печатать адрес в формате 0x..

В C я читаю адрес с консоли и сохраняю его в переменной. Мне нужно записать адрес в шестнадцатеричном (0x...) формате.

У меня есть 2 варианта:

  1. %п
  2. %Икс

Я пробовал вариант 2 (%x). И это работает по-разному на 32- и 64-битных платформах. Это привело к неточному поведению программы.

Теперь второй вариант (%p) также определяется реализацией.

Поэтому я хотел бы знать, какой из них следует использовать для обеспечения согласованного поведения на всех компиляторах и платформах.

1 ответ

Стандарт C не гарантирует, что какой-либо метод печати указателей полностью «согласован» во всех реализациях, и не может этого сделать, поскольку указатели по своей сути специфичны для моделей памяти, которые не контролируются стандартом C.

Вы можете управлять некоторыми аспектами печати указателя, например, гарантировать, что он всегда печатается в шестнадцатеричном формате, преобразовав его и используя обычный управление преобразованием:

      #include <inttypes.h> // Define PRIxPTR.
#include <stdint.h>   // Define uintptr_t.
#include <stdio.h>    // Declare printf.

void PrintPointer(const volatile void *p)
{
    printf("0x%08" PRIxPTR, (uintptr_t) p);
}

Это гарантирует, что указатель будет напечатан в шестнадцатеричном формате для представления его битов. Он должен содержать достаточно информации для воспроизведения значения указателя (или его эквивалента), поэтому дисплей обязательно будет содержать достаточную информацию об указателе. Однако порядок и значение битов не определены стандартом C. В гарантирует, что будет напечатано не менее восьми цифр (с ведущими нулями по мере необходимости), что дает вам некоторую однородность для смешанных архитектур 32- и 64-битных указателей, но реализации C могут использовать любое количество бит, поэтому указатель может быть напечатан с цифры. Вы можете использовать просто если вы не считаете фиксацию количества цифр частью «согласованного» форматирования.

В type не является обязательным, но, вероятно, будет предоставлен в современных реализациях C.

и квалификаторы не имеют отношения к самой программе; они включены просто для того, чтобы указатели с ними или без них могли быть переданы в подпрограмму без жалоб со стороны компилятора.)

Другие вопросы по тегам