Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在64位系统上使用printf%016x与%p打印地址_C_Pointers_Printf - Fatal编程技术网

C 在64位系统上使用printf%016x与%p打印地址

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);

我在读一本关于C和汇编的书时遇到了一些麻烦。作者使用32位环境,而我使用64位。 问题是作者经常使用

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
保证能够保存指针的整数表示,所以它是可移植的,语义正确-每个人都赢:)