将void *转换为char *

问题描述 投票:0回答:1

我如何将void * ptr转换为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;
}

c pointers memory-address
1个回答
0
投票

假设您要打印void *指针的值,那么您有多个选项:

  1. printf()%p格式说明符一起使用,这恰好是要以十六进制形式打印指针。

    void *ptr = &a;
    printf("ptr = %p\n", ptr);
    

    结果:

    ptr = 0x7fffa6cf0f64
    
  2. 如果printf()不支持%p,请使用%lx格式说明符强制转换指针。这是假设您系统上的sizeof(void*) == sizeof(unsigned long)

    void *ptr = &a;
    printf("ptr = 0x%lx\n", (unsigned long)ptr);
    

    结果:

    ptr = 0x7fffa6cf0f64
    
  3. 如果根本没有printf(),请手动转换该值,然后将其写出。假设您的系统是小端(如果大端只是将for循环求反)。

    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
    
© www.soinside.com 2019 - 2024. All rights reserved.