Если я правильно понял, вам интересен вывод адреса функцией write() в 16-ричном формате без лидирующих нулей.
Например, вот так:
#include <unistd.h>
#include <limits.h> // CHAR_BIT определен здесь
// значение `x` должно быть < 16
static inline void
print_hb (int fd, unsigned char x)
{
write(fd, "0123456789abcdef" + x, 1);
}
// для CНAR_BIT > 8 изменения вносить в эту функцию
// для CНAR_BIT == 8 -- поскольку делим байт пополам, требования к аргументам `print_hb()` удовлетворены
void
print_byte (int fd, unsigned char b)
{
print_hb(fd, b >> 4);
print_hb(fd, b & 0xf);
}
void
print_addr (int fd, void *a)
{
if (a) {
size_t x = (size_t)a;
int i, n = sizeof(x);
for (i = 0; i < n - 1; i++) // пропустим лидирующие нулевые байты
if ((x >> ((n - i - 1) * CHAR_BIT)))
break;
for (; i < n; i++)
print_byte(fd, (unsigned char)(x >> ((n - i - 1) * CHAR_BIT)));
} else
print_hb(fd, 0);
}
Окружающее форматирование -- "0x" перед выводом (если адрес не 0) и \n в конце (если требуется) добавляйте сами по мере надобности.
P.S.
справедливости ради, программа правильна только для CHAR_BIT == 8
char*- это и есть буффер. – KoVadim Jan 04 '19 at 13:51char *? – AnT stands with Russia Jan 04 '19 at 16:06char [10],char [20],char [100500]и т.п.char *никак не может быть строкой и записать в него строку никак нельзя. – AnT stands with Russia Jan 04 '19 at 19:31