这将是什么输出?请解释一下

时间:2014-01-26 09:45:54

标签: c memory-management compiler-construction offset memory-segmentation

#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

这个中的内存地址是什么,哪个部分是偏移的?

2 个答案:

答案 0 :(得分:5)

显然,您的a变量已使用0初始化。

  • %u显示无符号整数,并将内存地址作为参数传递
  • %p通常显示指针的值,因此如果为0,则显示为(nil)
  • %p也会这样做,但您现在传递a的地址,该地址以十六进制显示。
  • %fp%f(浮动格式)和文字p。我很确定这个会导致未定义的行为,因为printf需要一个float并且你传递一个整数(指针是长/整数值)。

我们从中学到了什么? 不要写无意义的代码不要将参数传递给printf样式的函数,除非你的格式字符串完全符合那些参数

答案 1 :(得分:0)

好像你正在读一本非常古老的书。段和偏移组合用于寻址16位应用程序中的内存,它们被称为“远指针”而不是仅包含偏移的“局部指针”(段通常取自ds寄存器)。

对于32位或64位应用程序,这些都不再相关。这些应用程序使用单个虚拟内存块,不再细分为段。操作系统负责将虚拟内存的一部分映射到物理内存,这是应用程序不再需要担心的问题。所有指针都只是虚拟内存空间内的偏移量(32位或64位,分别为32位或64位应用程序) - 单个数字。

对于你的printf语句,唯一一个实际将指针指向a并将其作为指针打印的文件是printf("%p\n ",&a) - 其他人无效,如另一个所指出的那样答案。