我正在写一个代码来读取链表中节点的地址,这样就可以有人确认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
大小相同要安全地以十进制打印指针值,应使用PRIuPTR
frominttypes.h
:printf ("Location of root is %"PRIuPTR"\n", (uintptr_t)root);