今天我在写代码时遇到了一个问题。如图,我分别打印了数组地址和指向数组的指针的大小
打印出的结果如下图所示
已知现在指针中存放的为数组的首地址,求出其大小为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
到此,我的疑问已经全部解决,还对之前半懂不懂的理论知识有了更加清晰的理解,之后我会更加积极的思考,努力发现问题,找到我的知识盲区。