首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印指针地址和符号地址的区别

打印指针地址和符号地址的区别
EN

Stack Overflow用户
提问于 2014-09-12 09:01:42
回答 2查看 419关注 0票数 1
代码语言:javascript
运行
复制
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");

上面的代码返回以下内容:

代码语言:javascript
运行
复制
The address of firstInt is: 1606416332
The address of firstInt is: 0x7fff5fbff7cc

我知道0x7fff5fbff7cc是十六进制的,但是当我试图将这个数字转换为十进制时,它并不等于1606416332。为什么会这样呢?两个不应该都返回相同的内存地址吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-12 09:07:59

从你的十六进制地址-

代码语言:javascript
运行
复制
The address of firstInt is: 0x7fff5fbff7cc

地址的大小是6个字节长。但是unsignedint的大小是4个字节。当您试图使用%u打印地址时,它将导致未定义的行为。

因此,始终使用%p打印地址。

票数 1
EN

Stack Overflow用户

发布于 2014-09-12 09:10:13

看来你在修一台64位的机器。你的指针是64位长

两者(&firstIntpointerFirstInt)是完全相同的。但显示方式不同。"%p"知道指针是64位,并以十六进制形式显示它们。"%u"显示十进制数,并假定为32位。所以只显示了一部分。

如果将1606416332转换为十六进制,则如下所示:0x5FBFF7CC。您可以看到,这是64位地址的下半部。

编辑:进一步解释:

由于printf是var-arg函数,所以您提供给它的所有参数都放在堆栈上。因为你在这两种情况下都放了8个字节。由于Pcs机使用的是小终端,所以首先将较低的字节放在上面。printf函数解析字符串并到达%[DatatypeSpecifier]点,并根据DatatypeSpecifier所需的数据类型从堆栈读取多少字节。因此,对于"%u",它只读取4个字节,而忽略其他字节。由于您编写的是"%u"而不是"%x",所以它以十进制而不是十六进制形式显示值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25804498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档