Linux 64位地址存储结构

文章探讨了在64位Linux系统中,指针大小为8字节,但显示地址为何只有6字节的问题。这源于系统仅使用47位地址,高17位作为扩展位。同时,文章介绍了内存的五大部分——代码段、数据段、BSS段、堆和栈,以及它们各自的作用,特别是指针地址在栈中的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我在写代码时遇到了一个问题。如图,我分别打印了数组地址和指向数组的指针的大小

 

 打印出的结果如下图所示

 已知现在指针中存放的为数组的首地址,求出其大小为8个字节,但是对应打印出的具体地址却只有6个字节,这是为什么呢?在查找资料后,我得到了答案。

https://mbd.baidu.com/ma/s/Ua1Mxl3S

Linux 64位系统有64bit的理论存储空间,也就是8个字节,但实际情况是Linux只运用了其中的低47位,而高17位为扩展位,所以能够访问的用户空间为0x0000000000000000 ~ 0x00007FFFFFFFFFFF,这就是为什么地址只显示6字节的原因。

户区由以下几部分组成:代码段(text),数据段(data),BSS段,堆(heap),栈(stack)。下面对这些部分进行简单解释。

1.代码段:主要保存进程的二进制程序代码,也保存可读的常量、变量

2.数据段:主要保存初始化不为0的全局变量,以及用static修饰的静态变量

3.BSS段:主要保存未初始化的全局变量和初始化为0的全局变量,这里要注意的是,并没有给他们申请实际的内存空间,只用占位符记录了所需要的数据大小。

4.堆:主要用于动态分配内存,由低地址向高地址增长

5.栈:主要保存动态局部变量、函数的参数以及函数返回值,由高地址向低地址增长

这就解释了以上0x7ffe504083dc地址的由来。首先,他们都是属于动态局部变量,所以存放在栈上,而栈又是向下生长的,所以分配的地址接近栈顶0x00007FFFFFFFFFFF

到此,我的疑问已经全部解决,还对之前半懂不懂的理论知识有了更加清晰的理解,之后我会更加积极的思考,努力发现问题,找到我的知识盲区。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值