Есть ли случай, когда спецификатор формата%p не будет печатать адрес в формате 0x..
В C я читаю адрес с консоли и сохраняю его в переменной. Мне нужно записать адрес в шестнадцатеричном (0x...) формате.
У меня есть 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. В
В
(В