- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第四局部C语言高级编程第9章动态内存的堆与栈第10章函数指针的使用第11章回调函数的使用第12章C语言实现对象编程
2第9章动态内存的堆与栈
在嵌入式C语言程序开发中,一个非常重要的内容就是内存的使用,尤其是动态内存的使用。C语言中动态内存主要使用堆和栈来实现。本章主要内容:C语言中程序的存储区域动态内存的堆与栈的特性C语言语言与堆、栈的对应关系堆和栈使用的比照
9.1程序内存区域的使用9.1.1静态内存与动态内存C语言程序中数据所使用的内存分类:静态数据存储区只读数据区〔ROData〕已初始化的读写数据区〔RWData〕未初始化的读写数据区〔BSS〕它们都是在程序的编译-连接阶段确定的,在程序运行的初始化阶段,静态存储区将在内存中开辟,其大小和位置在程序的运行过程中都是固定不变的,仅当程序结束时才会被系统收回。动态数据存储区:栈〔stack〕堆〔heap〕它们是在程序运行过程中动态分配的,其大小将在程序运行过程动态地变化。
典型的动态内存管理形式:堆内存和栈内存的分配方向通常是相向的栈内在从高地址向低地地址分配堆内存从低地址向高地址分配动态内存的存储结构栈使用线性存储的方式堆使用链表来实现C语言程序的存储区如图9-1所示。
9.1.2C语言中的动态内存1.栈内存栈是一种先入后出FILO(后进先出LIFO)的内存区域。栈内存由编译器管理栈内存对应内存中的一块区域,有大小限制。栈内存的使用依赖于处理器的硬件机制--栈指针存放器。栈指针是一个指向栈内部区域的指针,它的值为一个地址,位于栈内存的上、下界之间。栈指针将栈区域分为两个局部:已使用区域未使用区域
栈内存的增长(生长)方向:向上增长(生长)向下增长(生长)栈指针的变化在向下增长的栈中,初始时栈指针是指向栈的上界〔高地址端〕,随着入栈数据的增加,栈指针将向低地址端变化,即栈指针将变小。在向上增长的栈中那么相反。栈内存的重要特性:后进先出〔LIFO〕栈内存的根本操作:入栈〔PUSH〕出栈〔POP〕
入栈、出栈过程〔以向下增长的满栈为例〕入栈:先修改指针,再放内容,入栈后,指针指向刚入栈的数据出栈:先取内容,再修改指针,指向下一个要出栈的数据只能对栈顶数据进行操作。栈内存是一端固定〔栈底〕,一端浮动〔栈顶〕的。AABB低地址高地址上界?下界?XX
空栈和满栈空栈:栈指针所指的位置没有数据。入栈时,先放数据,后修改指针,出栈时,先修改指针,再取数据。满栈:栈指针所指的位置总有数据〔刚入栈的数据或将要取出的数据〕一个系统是满栈or空栈是由处理器结构决定的,与程序的编写无关。前面演示的是满栈的情况
栈总结:综合栈的生长方向和指针所指单元是否使用,栈可分为四种情况:满递增栈:入栈时,指针先增加,再放数据,入栈后,栈指针指向刚入栈的数据;出栈时,先取数据,指针再减少,出栈后栈指针指向下一数据。满递减栈:入栈时,指针先减小,再放数据,入栈后,栈指针指向刚入栈的数据;出栈时,先取数据,指针再增加,出栈后栈指针指向下一数据。空递增栈:入栈时,先放数据,指针再增加,入栈后,栈指针指向一个新的空位置;出栈时,指针先减少,再取数据,出栈后栈指针指向的位置的数据已被取出〔空位置〕。空递减栈:入栈时,先放数据,指针再减小,入栈后,栈指针指向一个新的空位置;出栈时,指针先增加,再取数据,出栈后栈指针指向的位置的数据已被取出〔空位置〕。
2.堆内存在一般的编译系统中,堆内存的分配方向和栈内存是相向的:如,栈内存从高地址向低地址增长时,堆内存便从低地址向高地址分配。在C语言中,堆内存的分配和释放是通过程序调用C语言的库函数〔malloc()、calloc()、realloc()〕来实现的。而栈内存是使用处理器的硬件机制实现的。
堆内存的分配过程:分配:每调用一次malloc()函数,都将返回一个当前分配到的内存区域的首地址〔指针〕,根据指针可访问分配到的堆内存空间释放:调用free()函数可释放用malloc()函数分配到的内存,不影响其他未释放的堆内存区域的使用。栈内存和堆内存在分配和使用上的区别:栈内存只有一个入口点--栈指针,它的位置是已使用区和未使用区的界限,栈的访问只能通过栈指针及偏移量进行堆内存可有多个入口点,每次分配得到的指针都是访问的入口点,每个指针指向的区域可被单独释放。
堆内存的分配原那么:堆内存的分配是从堆内存的低地址端开始进行分配,如果低地址端找不到一个满足要求的连续区域,将到较高地址端去分配,直到分配成功时返回分配的内存区域的首地址,或失败时返回NULL。内存碎片频繁采用malloc()和free()函数进行不同大小的内存分配和释放操作,将会在内存中产生内存碎片〔太小而无法分配使用的内存区域〕。
9.2C程序
文档评论(0)