#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
这里的分段内存地址是什么,偏移的部分是什么?
#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
这里的分段内存地址是什么,偏移的部分是什么?
显然你的a
变量是用0
.
%u
显示一个无符号整数,并将内存地址作为参数传递%p
通常显示指针的值,因此如果为 0,则显示为(nil)
%p
做同样的事情,但你现在传递 的地址a
,它以十六进制显示。%fp
is %f
(浮点格式)和文字p
. 我很确定这会导致未定义的行为,因为 printf 需要一个浮点数并且您传递一个整数(指针是长/整数值)。我们从中学到什么?不要编写无意义的代码,也不要将参数传递给 printf 风格的函数,除非你有一个格式字符串,它需要这些参数。
看来您正在阅读一些非常古老的书。段和偏移量组合用于在 16 位应用程序中寻址内存,它们被称为“远指针”,而不是仅包含偏移量的“本地指针”(段通常从ds
寄存器中获取)。
这些都与 32 位或 64 位应用程序无关。这些应用程序使用不再细分为段的单个虚拟内存块。操作系统负责将部分虚拟内存映射到物理内存,这是应用程序不再需要担心的事情。所有指针只是该虚拟内存空间内的一个偏移量(32 位或 64 位分别用于 32 位或 64 位应用程序) - 一个数字。
至于您的printf
陈述,唯一真正将指针指向a
并将其打印为指针的是printf("%p\n ",&a)
- 正如另一个答案所指出的那样,其他的都是无效的。