我正在写一个代码来读取链表中节点的地址,这样就可以有人确认printf中的%p%u格式是否正确。一个给我十六进制,另一个给我十进制,十六进制或十进制的转换是匹配的。如果有人能简要介绍一下%p%u之间的区别,那就太好了。

struct node {
    int x;
    struct node *next;
};

int main () {
    struct node *root;
    struct node *track;

    root = malloc(sizeof(struct node));
    printf ("Location of root is %p\n", root);
    printf ("Location of root is %u\n", root);
}

执行输出:
[根@vm c_prog]#/a.out
根的位置是0xdc3010
根的位置是14430224
[根@vm c_prog]#/a.out
根的位置是0x11fbf010
根的位置是301723664
[根@vm c_prog]#/a.out
根的位置是0x7e8e010
根部位置为132702224
[根@vm c_prog]#

最佳答案

%p表示指针,并且是正确的严格地说,您应该强制转换为void *,但我从来没有遇到过关心它的实现例子:

printf ("Location of root is %p\n", (void *)root);

%u代表一个unsigned int并且是不正确的,除非你玩一些投掷体操并且确定一个指针和一个int大小相同要安全地以十进制打印指针值,应使用PRIuPTRfrominttypes.h
printf ("Location of root is %"PRIuPTR"\n", (uintptr_t)root);

10-04 21:54
查看更多