您的位置:首页 > 其它

变量与内存空间的关系

2015-10-06 22:53 260 查看
有程序如下,申请了5个int *指针

有程序如下,申请了5个int *指针

编译结果如下,为什么空间不是连续分配的呢?

图片

那我们就去代码存放的目录看一下吧~进程运行信息一般存放在/proc/$pid

图片

其中cwd是工作路径,exe指向执行程序,fd是打开的文件,cpuset是程序用cpu的信息,maps是所有的内存结构,对就看一下maps

可以看出任何程序的内存空间分为4个基本部分。分别为:代码区,全局栈区,堆,和局部栈区。

代码区负责将程序加载到内存空间中。全局栈区,存放全局变量。堆和局部栈。那我们的平时的变量分别放在什么区域里面呢?

我们做个实验

图片

图片

我们看一下这段代码内的变量都存放在哪里吧

a1,a2在全局区,a3在代码区,b1在栈中,b2在全局区,b3在局部站区,p1在堆中,main在代码区,add在代码区

堆一般是靠一个链表实现,一个链表一般有4个结点。

malloc一般使用一个数据结构(一般是链表)维护分配的空间。其中链表的结点用来管理分配的空间,上一个空间数据和下一个空间的数据。如果对malloc分配的空间越界访问容易破坏后台维护结构,导致malloc,free,calloc等不正常工作。

这也就回答了一开始为什么malloc后内存不连续。也就是说malloc又一个链表维护,p1和p2的地址之间差了不只是p1本身的大小还有维护malloc的链表

编译结果如下,为什么空间不是连续分配的呢?



那我们就去代码存放的目录看一下吧~进程运行信息一般存放在/proc/$pid



其中cwd是工作路径,exe指向执行程序,fd是打开的文件,cpuset是程序用cpu的信息,maps是所有的内存结构,对就看一下maps

可以看出任何程序的内存空间分为4个基本部分。分别为:代码区,全局栈区,堆,和局部栈区。

代码区负责将程序加载到内存空间中。全局栈区,存放全局变量。堆和局部栈。那我们的平时的变量分别放在什么区域里面呢?

我们做个实验





我们看一下这段代码内的变量都存放在哪里吧

a1,a2在全局区,a3在代码区,b1在栈中,b2在全局区,b3在局部站区,p1在堆中,main在代码区,add在代码区

堆一般是靠一个链表实现,一个链表一般有4个结点。

malloc一般使用一个数据结构(一般是链表)维护分配的空间。其中链表的结点用来管理分配的空间,上一个空间数据和下一个空间的数据。如果对malloc分配的空间越界访问容易破坏后台维护结构,导致malloc,free,calloc等不正常工作。

这也就回答了一开始为什么malloc后内存不连续。也就是说malloc又一个链表维护,p1和p2的地址之间差了不只是p1本身的大小还有维护malloc的链表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: