为什么在64位OS上某些文件指针具有28位地址?

jiungsen

我是编程新手,有一个不重要但令人困惑的问题困扰着我。

让我先发布我的代码:

FILE *fp;
int i;

fp=fopen("test_data.txt", "r");
printf("i's address=%p\n", &i);
printf("fp's address =%p\n", fp);
printf("stdout's address=%p\n", stdout);
close(fp);

输出为:

i's address=0x7ffd038ab8cc
fp's address=0x231c010
stdout's address=0x7fbb2e4f7980

我的问题是,为什么fp的地址为28位?它不应该与普通变量和标准输出(48位)相同吗?

我在64位Ubuntu Linux上使用GCC。

感谢您的回答!

巴西勒·斯塔林凯维奇(Basile Starynkevitch)

fopen可能会打电话malloc要求其FILE*处理。

的某些实现malloc会在不同的地址空间段中分配不同的“小”对象和“大”对象(通过mmap(2)syscalls(2)中列出的某些其他系统调用获得

在某些实现中,stdout是指向某些静态数据的指针...

另外,您可能已启用ASLR ...

您可以在运行的进程上使用pmap(1)进行调查另请参见proc(5) ; 如果有时间,请从/proc/self/maps程序内部顺序读取各行,然后将其复制到stdout还要尝试cat /proc/$$/maps了解您的Shell的虚拟地址空间是什么

您也可以strace(1)您的程序以了解它正在执行的许多系统调用。

但是你真的不应该打扰。从C角度来看,地址或多或少是随机的(除非您深入了解实现细节)

(在某些x86-64处理器上,实际上只有48位地址,而最高的16位全为零或全为一。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么32位和64位地址有两种不同的长度?

具有64位地址的xxd

为什么gdb在64位计算机上仅显示32位地址?

如果32位微处理器具有24位地址空间,为什么以字节而不是位给出最大地址数(2 ^ 24)的答案?

为什么32位地址的地址空间只有4G字节?

为什么64位计算机上的内存访问错误指向32位地址?

CALLF(Far Call)能否在Intel 64架构中具有64位地址存储操作数?

RStudio在具有64位R安装的64位OS上以32位运行

为什么 C 变量在 Android 12 上具有特殊的 40 位内存地址?

从32位地址转换为64位整数会产生意外结果

如何将64位地址mmap()转换为32位进程?

在64位系统上使用更大的指针有什么好处?

为什么在Windows 7上virtualbox仅具有32位选项,而没有64位选项?

为什么接口具有禁用了IPv6的IPv6地址?

为什么虚拟地址是 48 位而不是 64 位?

如何在具有vm的Ubuntu 64位上安装64位OS?

如果CPU具有16位地址总线和8位字,那么它可以寻址多少内存?

24位地址和24位算术与24位地址与16位地址的算术之间的区别?

将两个ipv4地址编码为64位

如何将ipv4地址扩展到64位?

为什么 VirtualBox 在 Windows 10 上只有 32 位选项,没有 64 位选项?

我真的可以使用8位地址来映射ELF文件吗?

Fedora 28系统上的这两个IPv6地址是什么?

ping并使用三个八位字节的ipv4地址。为什么运作?

为什么我们需要一个单独的结构来保存32位IPv4地址

为什么32位CPU / OS / Java上的Tomcat 7比64位上的Tomcat 7慢得多?

在具有64位CPU的32位Win8上运行32位Orwell Dev-C ++-增加指针将返回错误结果

无法将8位地址移动到16位寄存器

使用32位Java编译器生成的.class文件可以在具有64位JVM的64位系统上使用吗?