我正在从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'
正如你可以看到最后三个字符是错误的,有没有关于它的文档?
1 回答
在第二种情况下,您将变量
ptr
的地址转换为int
,而不是其值(您感兴趣的指针) .用
(unsigned int)ptr;
替换(unsigned int)&ptr;
将为您提供一致的值 .另外一个:不能保证
unsigned int
足够大以表示指针值:你应该使用intptr_t
或<stdint.h>
来自<stdint.h>
.