读取下一个节点的链表中的内存位置

时间:2013-02-07 16:17:13

标签: c

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

3 个答案:

答案 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指针。