这将是啥输出?也请解释一下[关闭]
Posted
技术标签:
【中文标题】这将是啥输出?也请解释一下[关闭]【英文标题】:What will be the output of this? Please explain it also [closed]这将是什么输出?也请解释一下[关闭] 【发布时间】:2014-02-17 04:13:19 【问题描述】:#include<stdio.h>
int main()
int a;
printf("%u\n ",&a);
printf("%p\n ",a);
printf("%p\n ",&a);
printf("%fp\n ",&a);
return 0;
我已经尝试过这段代码,但我无法理解输出
4193177020
(nil)
0x7ffff9eecdbc
0.000000p
这里面分割的内存地址是什么,偏移的部分是什么?
【问题讨论】:
这些 printf 语句中只有一个有效;你想在这里实现什么目标? 先学printf
。
我也无法理解其中的三个,只有一个是有效的。
不,这个程序没有任何意义。仅供参考,我很确定这是last question you ever asked on SO,基于您发布的低质量和严重否决问题的数量......
@meaning-matters: 同意,虽然没有缩进是这里最不重要的问题 ;)
【参考方案1】:
显然您的 a
变量是用 0
初始化的。
%u
显示一个无符号整数,并将内存地址作为参数传递
%p
通常显示指针的值,因此如果为 0,则显示为 (nil)
%p
做同样的事情,但你现在传递a
的地址,它以十六进制显示。
%fp
是 %f
(浮点格式)和文字 p
。我很确定这会导致未定义的行为,因为 printf 需要一个浮点数并且您传递一个整数(指针是长/整数值)。
我们从中学到了什么? 不要编写无意义的代码并且不要将参数传递给 printf 样式的函数,除非您的格式字符串正好需要这些参数。
【讨论】:
赞成,但我会添加“使用-Wall
编译,这样你至少会被警告你的废话”。【参考方案2】:
看来你在读一本很旧的书。段和偏移量组合用于在 16 位应用程序中寻址内存,它们被称为“远指针”,而不是仅包含偏移量的“本地指针”(段通常取自 ds
寄存器)。
这些都与 32 位或 64 位应用程序无关。这些应用程序使用不再细分为段的单个虚拟内存块。操作系统负责将部分虚拟内存映射到物理内存,这是应用程序不再需要担心的事情。所有指针都只是该虚拟内存空间内的一个偏移量(32 位或 64 位分别用于 32 位或 64 位应用程序) - 单个数字。
至于您的 printf
语句,唯一真正将指针指向 a
并将其打印为指针的是 printf("%p\n ",&a)
- 正如其他答案所指出的那样,其他语句无效。
【讨论】:
以上是关于这将是啥输出?也请解释一下[关闭]的主要内容,如果未能解决你的问题,请参考以下文章