这将是啥输出?也请解释一下[关闭]

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 ",&amp;a) - 正如其他答案所指出的那样,其他语句无效。

【讨论】:

以上是关于这将是啥输出?也请解释一下[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

树高的定义是啥?

字节数组是啥意思? [关闭]

nvidia-smi 的输出中的“关闭”是啥意思?

哈希是啥,谁能解释一下?

使用 main 函数进行递归

你能解释一下 Python 中的装饰器是啥吗? [关闭]