【C语言】数据存储结构
条评论内存结构
可执行程序(没有调用内存,没有运行时),内存结构分为:
- 代码区
- 数据区
- 未初始化数据区(BSS区)
可执行文件运行时有多处两个内存区域:
- 堆区
- 栈区
可执行文件
代码区(text区)
存放数据:存放程序执行代码,也有可能包含一些只读的常数变量。
这部分区域的内存大小在程序执行前就已经确定,并且内存区域属于只读。数据保存在目标文件中。
数据区(data区)
存放数据:在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据。
data区在编译时已经为数据分配了空间,数据保存在目标文件中。
data区属于静态分配,程序结束后静态变量资源由系统自动释放。
未初始化数据区(BSS区)
存放数据:程序中未初始化的全局变量和静态变量。
BBS区内容不存放在磁盘上的程序文件中,不占用可执行文件的大小,它是由链接器来获取内存的;原因是内核在程序运行前将他们都置为0。
BBS区属于静态分配,程序结束后静态变量资源由系统自动释放。
变量
堆区
堆允许程序在运行时动态分配内存,一般由程序员申请释放;
堆是由低地址位向高地址位增长,采用链式储存结构,位于BSS与栈中间的地址区域;
频繁的进行malloc/free会造成内存空间的不连续,产生碎片;
当申请对空间时库函数是按照一定的算法来搜索可用的足够大的空间。因此堆的效率比栈要地的多。
栈区
由编译器自动分配释放,存放函数的参数值、局部变量等值;每当一个函数被调用时,该函数的返回类型和一些调用信息被存放到栈中;然后这个被调用的函数再为它的自动变量和临时变量在栈上分配空间。每调用一个函数一个新的栈就会被使用。
栈区是由高地址位向低地址为增长的,是一块连续的内存区域,最大容量是由系统预先定义好的,申请的栈空间超过这个界限时会提示溢出。一般Windows是1M ~ 8M不等,一般Linux是1M ~ 16M不等。
参考: