int firstInt =10;
int *pointerFirstInt = &firstInt;
printf("The address of firstInt is: %u", &firstInt);
printf("\n");
printf("The address of firstInt is: %p", pointerFirstInt);
printf("\n");上面的代码返回以下内容:
The address of firstInt is: 1606416332
The address of firstInt is: 0x7fff5fbff7cc我知道0x7fff5fbff7cc是十六进制的,但是当我试图将这个数字转换为十进制时,它并不等于1606416332。为什么会这样呢?两个不应该都返回相同的内存地址吗?
发布于 2014-09-12 09:07:59
从你的十六进制地址-
The address of firstInt is: 0x7fff5fbff7cc地址的大小是6个字节长。但是unsignedint的大小是4个字节。当您试图使用%u打印地址时,它将导致未定义的行为。
因此,始终使用%p打印地址。
发布于 2014-09-12 09:10:13
看来你在修一台64位的机器。你的指针是64位长
两者(&firstInt和pointerFirstInt)是完全相同的。但显示方式不同。"%p"知道指针是64位,并以十六进制形式显示它们。"%u"显示十进制数,并假定为32位。所以只显示了一部分。
如果将1606416332转换为十六进制,则如下所示:0x5FBFF7CC。您可以看到,这是64位地址的下半部。
编辑:进一步解释:
由于printf是var-arg函数,所以您提供给它的所有参数都放在堆栈上。因为你在这两种情况下都放了8个字节。由于Pcs机使用的是小终端,所以首先将较低的字节放在上面。printf函数解析字符串并到达%[DatatypeSpecifier]点,并根据DatatypeSpecifier所需的数据类型从堆栈读取多少字节。因此,对于"%u",它只读取4个字节,而忽略其他字节。由于您编写的是"%u"而不是"%x",所以它以十进制而不是十六进制形式显示值。
https://stackoverflow.com/questions/25804498
复制相似问题