C 在64位系统上使用printf%016x与%p打印地址
我在读一本关于C和汇编的书时遇到了一些麻烦。作者使用32位环境,而我使用64位。 问题是作者经常使用C 在64位系统上使用printf%016x与%p打印地址,c,pointers,printf,C,Pointers,Printf,我在读一本关于C和汇编的书时遇到了一些麻烦。作者使用32位环境,而我使用64位。 问题是作者经常使用 printf("%08x", &var); 打印在32位上运行良好的地址。但是当我在64位上运行时,我只得到了地址的一半,而%p给出了整个地址。。。为什么会这样?我当然使用%016x而不是%08x 作者仅将%p用于指针。 那么什么时候应该使用what?在printf中打印指针,根据C标准,使用%p和void*类型是一种方法 printf("%p", (void *)&var);
printf("%08x", &var);
打印在32位上运行良好的地址。但是当我在64位上运行时,我只得到了地址的一半,而%p
给出了整个地址。。。为什么会这样?我当然使用%016x
而不是%08x
作者仅将%p
用于指针。
那么什么时候应该使用what?在
printf
中打印指针,根据C标准,使用%p
和void*
类型是一种方法
printf("%p", (void *)&var);
%p
在这两种情况下都应该是正确的;而&var
是指针。不清楚他们是否经常使用“%8x”或“%p”。不管怎样,指针的正确用法始终是“%p”。在处理打印大量指针时,我喜欢做的是:printf(“0x%”“PRIxPTR”,(uintpttr\u t)(&var))
您可以从inttypes.h
获得PRIxPTR
和uintptpttr\u t
,我喜欢这种方法,因为打印整数的语义对我来说非常清楚,而打印指针的语义有点模糊。而且,uintpttr\u t
保证能够保存指针的整数表示,所以它是可移植的,语义正确-每个人都赢:)