我如何将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;
}
假设您要打印void *
指针的值,那么您有多个选项:
将printf()
与%p
格式说明符一起使用,这恰好是要以十六进制形式打印指针。
void *ptr = &a;
printf("ptr = %p\n", ptr);
结果:
ptr = 0x7fffa6cf0f64
如果printf()
不支持%p
,请使用%lx
格式说明符强制转换指针。这是假设您系统上的sizeof(void*) == sizeof(unsigned long)
。
void *ptr = &a;
printf("ptr = 0x%lx\n", (unsigned long)ptr);
结果:
ptr = 0x7fffa6cf0f64
如果根本没有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