打印十六进制值(%x
)和地址(%p
)时,格式略有不同。在十六进制值的情况下,打印值不以0x
开头:
int main()
{
int x = 0x1234;
printf("Value of x: %x\n", x);
printf("Address of x: %p\n", (void*)&x);
}
收益率(gcc):
Value of x: 1234
Address of x: 0xffb0fbfc
为什么0x
在地址的情况下强迫你?
我想它归结为标准。
如果我愿意,在没有0x
的情况下打印地址的正确方法是什么? %p
不仅是%x
,还有0x
对吗?
答案 0 :(得分:9)
P
参数应该是指向void的指针。指针的值是 转换为一系列可打印的字符,在一个 实现定义的方式。
答案 1 :(得分:5)
%p
的输出格式是特定于实现的。并非每个C实现都在地址与int
相同的机器上。来自intptr_t
<stdint.h>
答案 2 :(得分:2)
%p不仅是一个%x,右边加了0x?
否.. %p
期望参数为type(void *)并打印出地址。
%x
将unsigned int转换为无符号十六进制并打印出地址。
%p
所做的是实现定义,但标准只是说%p
期望void*
参数,否则行为是未定义的。
答案 3 :(得分:1)
MSVC不强制&#34; 0x&#34;在我身上添加前缀,但您可以选择将其删除:
#include <stdio.h>
#include <string.h>
int main(void) {
int x = 123;
char hexstr[20];
sprintf(hexstr,"%p", (void*)&x);
if (strstr(hexstr,"0x") == hexstr)
printf ("%s\n", hexstr+2);
else
printf ("%s\n", hexstr);
return 0;
}