我正在编写一个代码来读取链表中节点的地址,因此有人可以确认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 Location of root is 0xdc3010 Location of root is 14430224 [root@vm c_prog]# ./a.out Location of root is 0x11fbf010 Location of root is 301723664 [root@vm c_prog]# ./a.out Location of root is 0x7e8e010 Location of root is 132702224 [root@vm c_prog]#
答案 0 :(得分:2)
区别在于%u = unsigned int,%p =指针......这些在系统/拱门上的大小可能不同,不应互换使用。
答案 1 :(得分:2)
%p
用于指针,并且是正确的。严格来说,你应该转向void *
,但我从来没有遇到过一个关心的实现。例如:
printf ("Location of root is %p\n", (void *)root);
%u
适用于unsigned int
并且不正确,除非您玩一些演员体操,并且确定指针和int
大小相同。要安全地打印十进制的指针值,您应该使用PRIuPTR
中的inttypes.h
:
printf ("Location of root is %"PRIuPTR"\n", (uintptr_t)root);
答案 2 :(得分:2)
是的,%p
以实现认为合适的任何格式打印指针(通常是十六进制 - 这就是你现在看到的),%u打印一个无符号整数。如果您使用%x,则可能会得到更相似的结果。但是,%p
也理解指针的大小,在64位系统中它与整数不同,这是%u
或%x
将打印的。
从技术上讲,%p
也'只'适用于void指针。