变量与内存空间的关系
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的链表
编译结果如下,为什么空间不是连续分配的呢?
![](http://r.photo.store.qq.com/psb?/V14IGs962aMGOC/pbYMuvSO1ozGuL7pVJz5zFHZAOsycKxYyHjdVAGe0bY!/o/dBQAAAAAAAAA&ek=1&kp=1&pt=0&bo=dwCCAHcAggADACU!&su=125410145&sce=0-12-12&rf=2-9)
那我们就去代码存放的目录看一下吧~进程运行信息一般存放在/proc/$pid
![](http://r.photo.store.qq.com/psb?/V14IGs962aMGOC/oTAfuD74yYqqyn8gaBvrR27uz8yb6X*Be330uZEKKcU!/o/dA4AAAAAAAAA&ek=1&kp=1&pt=0&bo=GQPiABkD4gADACU!&su=186153201&sce=0-12-12&rf=2-9)
其中cwd是工作路径,exe指向执行程序,fd是打开的文件,cpuset是程序用cpu的信息,maps是所有的内存结构,对就看一下maps
可以看出任何程序的内存空间分为4个基本部分。分别为:代码区,全局栈区,堆,和局部栈区。
代码区负责将程序加载到内存空间中。全局栈区,存放全局变量。堆和局部栈。那我们的平时的变量分别放在什么区域里面呢?
我们做个实验
![](http://b21.photo.store.qq.com/psb?/V14IGs962aMGOC/JlgRppgVh6AkIcBAecOuHVM7LSPGM3lRPk6DsEy3sO8!/b/dBUAAAAAAAAA&ek=1&kp=1&pt=0&bo=XQH9AQAAAAADAIU!&su=0102827025&sce=0-12-12&rf=2-9)
![](http://r.photo.store.qq.com/psb?/V14IGs962aMGOC/0El4DDCUY7vKozycCb7ME*L.i4KkxZtcZq5UxX4LjWE!/o/dA4AAAAAAAAA&ek=1&kp=1&pt=0&bo=NgH3ADYB9wADACU!&su=1156392417&sce=0-12-12&rf=2-9)
我们看一下这段代码内的变量都存放在哪里吧
a1,a2在全局区,a3在代码区,b1在栈中,b2在全局区,b3在局部站区,p1在堆中,main在代码区,add在代码区
堆一般是靠一个链表实现,一个链表一般有4个结点。
malloc一般使用一个数据结构(一般是链表)维护分配的空间。其中链表的结点用来管理分配的空间,上一个空间数据和下一个空间的数据。如果对malloc分配的空间越界访问容易破坏后台维护结构,导致malloc,free,calloc等不正常工作。
这也就回答了一开始为什么malloc后内存不连续。也就是说malloc又一个链表维护,p1和p2的地址之间差了不只是p1本身的大小还有维护malloc的链表
有程序如下,申请了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的链表
相关文章推荐
- fontAwesome代替网页icon小图标
- 汇编“生活”(一)——王爽《汇编语言》实验9程序代码——改变显示器字体颜色
- [经济学原理|宏观部分]简单国民收入决定理论
- Matlab机器人工具箱
- 多态
- [经济学原理|宏观部分]国民收入核算理论
- 《清明上河图密码2》北宋首都的扰乱大宗商品交易秩序的大案。精妙的推理过程与大量细致的当时商业与生活细节同时出现在书中,五星推荐
- GCT试题训练感受及总结
- 【笔记】Spring MVC学习指南(十一)上传文件
- 9月30日课程重点
- 【ScrollView】Android ScrollView监听滑动事件
- UVA 11600 Masud Rana(概率dp)
- 大龄屌丝自学笔记--Java零基础到菜鸟--026
- Android启动Run As是报 Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE错误
- ZH奶酪:PHP error_log()将错误信息写入日志文件
- angularjs基本理解
- Intersection of Two Linked Lists
- 收藏几个安卓镜像地址
- CentOS7下mariaDB和phpmyadmin的一些安装和配置问题
- 解决 js 中文乱码问题小技巧