C语言:C代码在内存中的分布详解
2016-05-03 00:34
381 查看
以下为收集整理的资料:如有错误地方请提出意见
在内存中程序分别存储在如下几个区域中:
一、正文区(Code or Text)
对于名字有很多,有的称为代码段,代码区等等。但是实质都是一样的,都是用来存放程序语句进行编译后,形成机器的代码。一般此内存区是只读的,防止程序意外修改指令。
二、初始数据段(RO/RW data segment)
通常是用来存放程序中已初始化的全局变量的一块内存区域。又分为只读和读写两种,此数据段属于静态内存分配
三、未初始化数据段(BSS = Block Started by Symbol)
未初始化读写据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间.BSS段也属于静态内存分配
四、堆(heap)
堆内存只在程序运行时出现,一般由程序员手动分配和释放,一般可以使用malloc()/nalloc() & free() 函数来申请、释放。在操作系统下,如果程序员没释放,一般操作系统可以在程序结束后回收内存
五、栈(stack)
存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的最大特点后进先出,所以栈特别方便用来保存/恢复调用现场。
用图片来解释会更加通俗。左图是书上的。从图上可以看到,栈(stack)是自顶向下生长的,即由高地址向低地址;堆(heap)是自底向上生长。右图是栈的进出示意图,很明显的后进先出。
这里比较重要的概念主要是 栈 和 堆。在网上收集了下他们之间的 PK “数据”
栈的一些特殊定义:
栈限定只能在表的一端进行插入和删除操作的线性表。允许插入和删除的一端称作“栈顶(top)”,不允许插入和删除端称作“栈底(bottom)”
空栈:这里有两种说法。1.堆栈指针指向下一个将要放入数据的空位置时。
2.栈顶指向栈底地址时,即栈内没有数据时为空栈。
(对于上面这两种定义一直没有找到权威的出处。网上两种概念都存在,我也不知道哪种才是正确的,希望有明确此概念的大神提点下。)
满栈:栈指针指向的是一个有可用数据的,也就是最后一个使用的空间。
有图才有真相,没图没人理.上图咯。
在内存中程序分别存储在如下几个区域中:
一、正文区(Code or Text)
对于名字有很多,有的称为代码段,代码区等等。但是实质都是一样的,都是用来存放程序语句进行编译后,形成机器的代码。一般此内存区是只读的,防止程序意外修改指令。
二、初始数据段(RO/RW data segment)
通常是用来存放程序中已初始化的全局变量的一块内存区域。又分为只读和读写两种,此数据段属于静态内存分配
三、未初始化数据段(BSS = Block Started by Symbol)
未初始化读写据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间.BSS段也属于静态内存分配
四、堆(heap)
堆内存只在程序运行时出现,一般由程序员手动分配和释放,一般可以使用malloc()/nalloc() & free() 函数来申请、释放。在操作系统下,如果程序员没释放,一般操作系统可以在程序结束后回收内存
五、栈(stack)
存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于栈的最大特点后进先出,所以栈特别方便用来保存/恢复调用现场。
用图片来解释会更加通俗。左图是书上的。从图上可以看到,栈(stack)是自顶向下生长的,即由高地址向低地址;堆(heap)是自底向上生长。右图是栈的进出示意图,很明显的后进先出。
这里比较重要的概念主要是 栈 和 堆。在网上收集了下他们之间的 PK “数据”
栈 | 堆 |
栈内存从高地址向低地址分配 | 堆内存将从低地址向高地址分配 |
栈使用线性存储的方式 | 堆使用链表来实现 |
栈是连续内存分布的方式 | 堆是非连续内存分布方式 |
栈只有一个入口,就是栈指针,栈指针标识当前栈区域中已经使用与未使用的界限,程序访问栈内存的时候都只能通过栈指针及其偏移量 | 堆内存有多个入口,每次分配得到的指针是访问内存的入口,每个分配内存都可被单独释放 |
栈内存在分配的时候,不能在程序中判断其成功与否,当栈内存的使用量比较大的时候(例如使用函数进行递归运算),栈内存可能超出系统的容量,这时程序运行将发生栈溢出错误 | 堆内存在分配的时候,可以在程序中判断malloc()等函数的返回值是否为NULL来确定对内存是否分配成功,是否可以使用 |
栈内存由编译器管理,不需要程序来管理,同时,函数内部的栈内存是不能被函数的调用者使用的 | 堆内存需要在程序中处理它的分配与释放情况(由程序调用具体的库函数管理),可以利用灵活的程序将堆内存的指针从函数的内部传递到函数的外部,这时各个函数都可以使用别的函数分配出来的堆内存。 |
栈限定只能在表的一端进行插入和删除操作的线性表。允许插入和删除的一端称作“栈顶(top)”,不允许插入和删除端称作“栈底(bottom)”
空栈:这里有两种说法。1.堆栈指针指向下一个将要放入数据的空位置时。
2.栈顶指向栈底地址时,即栈内没有数据时为空栈。
(对于上面这两种定义一直没有找到权威的出处。网上两种概念都存在,我也不知道哪种才是正确的,希望有明确此概念的大神提点下。)
满栈:栈指针指向的是一个有可用数据的,也就是最后一个使用的空间。
有图才有真相,没图没人理.上图咯。
相关文章推荐
- C++面向对象实验(四)
- C++ 面向对象实验(三)
- c++ 对象指针
- C++模板
- win10 运行VC++6.0
- 【AKOJ】1061-最小公倍数
- 外部排序,C++实现
- 使用VS开发C语言
- [LeetCode#3][C]Longest Substring Without Repeating Characters
- C++中创建临时对象的情况
- 【AKOJ】1298-B趣味求和
- C++实现的十字链表:容器和迭代器
- 第6周 C语言及程序设计提高例程-24 数组名作为函数参数
- 转载:C++编译期多态与运行期多态
- 交叉编译多个cpp或者c文件自动构建Makefile
- 标准C++中string的使用++
- c++primer第二遍阅读感悟(chap2)
- C语言学习笔记
- 第6周 C语言及程序设计提高例程-22 用指针法访问数组元素
- 一起talk C栗子吧(第一百四十五回:C语言实例--socket概述)