Данные в переменной MemoryAddress
являются указателем, а не строкой символов.Он должен быть преобразован в строку символов, прежде чем он может быть объединен с другими символами.C не выполняет это преобразование автоматически.
Функция printf()
способна принимать указатели (и целые числа и другие типы чисел) и преобразовывать их в символы перед их печатью.Это то, что делают спецификаторы формата (например, %d
означает «получить следующий параметр и преобразовать его из знака int в символы, а затем вставить символы в этот момент»).
Другими словами, вы можете сделать это:
printf("Value At Address %p Is %d", (void *)MemoryAddress, ValueOfAddress);
Проблема в том, что указатели в C являются абстрактными и не могут быть простыми числами (например, они могут состоять из двух частей, например «сегмент: смещение»);и то, как отображаются указатели, должно быть определено реализацией, чтобы код мог быть переносимым, и поскольку его реализация определена, он может использовать или не использовать шестнадцатеричный код, а может или не использовать префикс 0x
(в зависимости от того, что чувствовал компилятор).
Другими словами;%p
означает «получить следующий параметр и преобразовать его из пустого указателя в символы, используя все, что имеет смысл для конкретного типа процессора, а затем вставить символы в этой точке».
Чтобы указатель былодиночное число и заставить printf()
отобразить это единственное число в шестнадцатеричном формате (без суффикса 0x
);если вы используете C99 (или более позднюю версию), вы можете #include <inttypes.h>
и сделать это:
printf("Value At Address " PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);
Теперь мы вернулись к исходной проблеме - как объединить суффикс 0x
?C не поддерживает внутреннюю конкатенацию во время выполнения (например, вам нужно использовать функции библиотеки, связанные со строками - например, strcat()
), и поддерживает только внутреннюю конкатенацию строк во время компиляции;и преобразование MemoryAddress
в символы, а затем объединение с strcat()
и последующая печать объединенной строки будет грязным.Самое простое решение состоит в том, чтобы избежать конкатенации и вместо этого поместить 0x
в строку формата, например:
printf("Value At Address 0x" PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);