1

我正在编写一个代码来读取链表中节点的地址,因此有人可以确认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);
}

执行输出:

[root@vm c_prog]# ./a.out
根的位置是 0xdc3010
根的位置是 14430224
[root@vm c_prog]# ./a.out
根的位置是 0x11fbf010
根的位置是 301723664
[root@vm c_prog]# ./a.out
根的位置是 0x7e8e010
根的位置是 132702224
[root@vm c_prog]#
4

3 回答 3

2

不同之处在于 %u = unsigned int 和 %p = 指针...它们在您的系统/架构上的大小可能不同,不应互换使用。

于 2013-02-07T16:20:39.580 回答
2

%p是指针,是正确的。严格来说,您应该转换为void *,但我从未遇到过关心的实现。例子:

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

%uis for anunsigned int并且是正确的,除非您玩一些铸造体操并且确定指针和 anint大小相同。要安全地以十进制打印指针值,您应该使用PRIuPTRfrom inttypes.h

printf ("Location of root is %"PRIuPTR"\n", (uintptr_t)root);
于 2013-02-07T16:21:51.907 回答
2

是的,%p以实现认为合适的任何格式打印指针(通常是十六进制 - 这就是您现在看到的),并且 %u 打印一个无符号整数。如果您改用 %x,您可能会得到更相似的结果。但是,%p也了解指针的大小,在 64 位系统中,它与整数不同,它是%u%x将打印的内容。

从技术上讲,%p也“仅”适用于 void 指针。

于 2013-02-07T16:23:29.760 回答