Вывести значение указателя в шестнадцатеричном формате без printf - PullRequest
0 голосов
/ 30 апреля 2020

Как я могу преобразовать указатель void * в char *, чтобы я мог напечатать адрес, сохраненный в ptr в шестнадцатеричном формате? Без printf().

#include<stdio.h>

int main()
{
    int a=5;
    void *ptr=&a;
    char *arr=(char*)ptr;
    write(1,arr,strlen(arr));

    return 0;
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Если у вас нет printf(), вам нужно будет вручную преобразовать значение и выписать его. В следующем примере предполагается, что ваша система имеет прямой порядок байтов (если это большой порядок байтов, просто инвертируйте for l oop). См. Определение порядка байтов для получения дополнительной информации.

void *ptr = &a;
unsigned char buf[sizeof(ptr)];

memcpy(buf, &ptr, sizeof(ptr));

for (int i = sizeof(ptr) - 1; i >= 0; i--) {
    unsigned char hi = (buf[i] >> 4) & 0xf; 
    unsigned char lo = buf[i] & 0xf;        
    char tmp[2] = {hi, lo};

    tmp[0] += hi < 10 ? '0' : 'a' - 10;
    tmp[1] += lo < 10 ? '0' : 'a' - 10;

    write(1, tmp, 2);
}

Результат:

00007fffa6cf0f64
0 голосов
/ 04 мая 2020

Указатель , указывающий на тип , не имеет ничего общего с указателем значения, которое вы хотите напечатать. Если вы хотите напечатать указатель значения как число (например, адрес, по которому это значение хранится в & memory), вы должны сначала преобразовать этот указатель в целое число, чтобы вы могли использовать метод печати чисел. Это делается внутри функции printf(3), когда вы указываете значение указателя (независимо от того, на какой тип он указывает) в формате с указателем формата %p.

#include<stdio.h>

int main()
{
    int a=5;

    printf("The address   of a is: %p\n", &a);
    printf("and the value of a is: %d\n", a);

    return 0;
}

При выполнении вы ' получу что-то похожее на это:

$ pru
The address   of a is: 0x7fffffffe3bc
and the value of a is: 5
$ _
...