用C语言打印指针地址
我正在从scrap复制printf,我需要将指针地址存储到字符串中,然后打印它,所以首先我将void*转换为无符号int,然后将其转换为十六进制,但最后三个字符是错误的用C语言打印指针地址,c,printf,C,Printf,我正在从scrap复制printf,我需要将指针地址存储到字符串中,然后打印它,所以首先我将void*转换为无符号int,然后将其转换为十六进制,但最后三个字符是错误的 int main(void) { char str[] = "printf from scrap!"; my_printf("MY_PRINTF:'%p'", (void*)str); printf("\n PRINTF:'%p'\n\n", (void*)str); ret
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'
正如您所看到的,最后三个字符是错误的,是否有相关文档?在第二种情况下,您将变量ptr的地址转换为int,而不是您感兴趣的指针的值 替换未签名的int&ptr;具有未签名的intptr;将为您提供一致的价值观
另外一点:不保证unsigned int足够大来表示指针值:您应该使用intptr\u t或uintptr\u t from。my_itoa\u base\u uint坏了吗?或任何其他my_*。my_printf在哪里?标准仅允许将指针投射到uintptr_t并安全返回。任何其他整数类型都不能保证完全存储指针。简而言之:不要使用uintptr_t以外的任何其他整数类型。感谢您的建议:您的代码添加0x7fff前缀的事实表明存在问题。您希望能够在32位无符号整数中保存64位指针-这不是幸福的秘诀,而且并非64位计算机中的所有指针您可能在Mac上吗?前缀为0x7fff。使用uintptr\t可以帮助您解决问题。