我正在从scrap中复制printf,我需要将指针地址存储到一个字符串然后打印它,所以首先我将void *转换为unsigned int然后将它转换为十六进制,但最后三个char是错误的。
int main(void)
{
char str[] = "printf from scrap!";
my_printf("MY_PRINTF:'%p'", (void*)str);
printf("\n PRINTF:'%p'\n\n", (void*)str);
return (0);
}
int conv_p(va_list args)
{
void *ptr;
unsigned int ptrint;
ptr = va_arg(args, void*);
ptrint = (unsigned int)&ptr;
my_putstr("0x7fff");
my_putstr(my_itoa_base_uint(ptrint, 16));
return (1);
}
输出:
MY_PRINTF:'0x7fff505247b0'
PRINTF:'0x7fff50524a20'
正如你可以看到最后三个字符是错误的,有没有关于它的文档?
答案 0 :(得分:3)
在第二种情况下,您将变量ptr
的地址转换为int
,而不是其值(您感兴趣的指针)。
用(unsigned int)&ptr;
替换(unsigned int)ptr;
将为您提供一致的值。
另外一点:不能保证unsigned int
足以表示指针值:您应该使用intptr_t
中的uintptr_t
或<stdint.h>
。