【发布时间】:2017-10-27 17:43:49
【问题描述】:
我正在尝试打印变量(特别是 argc)的内存地址。我正在使用 printf 并且我知道 %x 返回一个无符号十六进制整数,而 %p 返回一个指针地址。下面是我的简单代码供参考
int main (int argc, char **argv) {
printf("argc: addr=%x addrp=%p val=%x\n",&argc,&argc,argc);
return 0;
}
这样跑:./a.out 这是
它输出:argc: addr=af5144cc addrp=0x7ffcaf5144cc val=3
我看到 %x 返回一个字节的地址,对吗?因为它有 8 个数字或位?
但是,%p 返回相同的字节,前面有更多信息。什么是“0x7ffc”部分,它是什么意思?它是内存地址的一部分还是指出某种类型的信息?我知道 0x 部分意味着它是一个十六进制数。 %x 或 %p 是真正的内存地址吗?谢谢!
【问题讨论】:
-
用
%x打印指针是未定义的行为。用任何东西打印非void指针是未定义的行为。 -
%x打印一个unsigned int,在大多数现代平台上,它是 32 位的。%p打印特定于平台的指针值。有些平台是 32 位的,有些是 64 位的,可能还有其他大小。 -
您的
unsigned有32 位,但指针有64 位,所以%x正在截断地址。
标签: c