#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
这个中的内存地址是什么,哪个部分是偏移的?
答案 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)
- 其他人无效,如另一个所指出的那样答案。