-12
#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

这里的分段内存地址是什么,偏移的部分是什么?

4

2 回答 2

5

显然你的a变量是用0.

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

我们从中学到什么?不要编写无意义的代码也不要将参数传递给 printf 风格的函数,除非你有一个格式字符串,它需要这些参数

于 2014-01-26T09:52:34.630 回答
0

看来您正在阅读一些非常古老的书。段和偏移量组合用于在 16 位应用程序中寻址内存,它们被称为“远指针”,而不是仅包含偏移量的“本地指针”(段通常从ds寄存器中获取)。

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

至于您的printf陈述,唯一真正将指针指向a并将其打印为指针的是printf("%p\n ",&a)- 正如另一个答案所指出的那样,其他的都是无效的。

于 2014-02-24T09:40:17.097 回答