Where is `%p` useful with printf?

后端 未结 7 1446
鱼传尺愫
鱼传尺愫 2020-11-27 03:10

After all, both these statements do the same thing...

int a = 10;
int *b = &a;
printf(\"%p\\n\",b);
printf(\"%08X\\n\",b);

For example

相关标签:
7条回答
  • 2020-11-27 03:32

    x is used to print t pointer argument in hexadecimal.

    A typical address when printed using %x would look like bfffc6e4 and the sane address printed using %p would be 0xbfffc6e4

    0 讨论(0)
  • 2020-11-27 03:33

    At least on one system that is not very uncommon, they do not print the same:

    ~/src> uname -m
    i686
    ~/src> gcc -v
    Using built-in specs.
    Target: i686-pc-linux-gnu
    [some output snipped]
    gcc version 4.1.2 (Gentoo 4.1.2)
    ~/src> gcc -o printfptr printfptr.c
    ~/src> ./printfptr
    0xbf8ce99c
    bf8ce99c
    

    Notice how the pointer version adds a 0x prefix, for instance. Always use %p since it knows about the size of pointers, and how to best represent them as text.

    0 讨论(0)
  • 2020-11-27 03:33

    x is Unsigned hexadecimal integer ( 32 Bit )

    p is Pointer address

    See printf on the C++ Reference. Even if both of them would write the same, I would use %p to print a pointer.

    0 讨论(0)
  • 2020-11-27 03:35

    They do not do the same thing. The latter printf statement interprets b as an unsigned int, which is wrong, as b is a pointer.

    Pointers and unsigned ints are not always the same size, so these are not interchangeable. When they aren't the same size (an increasingly common case, as 64-bit CPUs and operating systems become more common), %x will only print half of the address. On a Mac (and probably some other systems), that will ruin the address; the output will be wrong.

    Always use %p for pointers.

    0 讨论(0)
  • 2020-11-27 03:35

    The size of the pointer may be something different than that of int. Also an implementation could produce better than simple hex value representation of the address when you use %p.

    0 讨论(0)
  • 2020-11-27 03:52

    When you need to debug, use printf with %p option is really helpful. You see 0x0 when you have a NULL value.

    0 讨论(0)
提交回复
热议问题