用C语言打印指针地址

用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

我正在从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);

    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可以帮助您解决问题。