个人理解—浅谈堆和栈

        在计算机编程过程中,往往都会接触两个东西一曰堆,一曰栈。往往总是堆栈堆栈的称呼着,但这俩其实是两种东西。

        栈(stack)FIFO(FIFO的是队列),主要用于小内存的使用,自动会进行申请与管理,临时变量就在其中“保存”。与其说保存不如说即用即申请更贴切。栈内存在程序生命周期中是反复被使用的,前面说到局部变量是在栈内存中“保存”的,而栈内存又不止一个变量进行使用,且栈内存不是每每都会进行清零,所以,未被初始化的局部变量,往往都是“随机值”,这些值都是前面使用过栈内存的操作未对栈进行清理时留下的数据,所以局部变量在申请时一定要初始化。

             这里就要插入一个题外话了,关于指针的题外话,任意类型的指针在申请时,返回的都是地址,而地址长度在不同位机器中长度是不同的,所以在32位机器中,任意类型的指针大小都是4字节,64位为8字节。

        堆(heap),主要用于大内存使用,手动进行申请和释放。堆的管理是自由的,在程序编写过程中,通过malloc、calloc、realloc进行内存申请,free进行释放。堆的管理是由操作系统的堆管理器负责,堆内存适用于反复释放的较大内存空间变量,当堆内存在申请后未进行释放,但堆管理器依旧进行内存记录,应用在下一次申请堆内存时会根据管理器记录向后进行内存申请,如此往复的申请新内存又不进行释放会造成吃内存的现象,最终造成内存泄漏(堆管理程序给程序的堆空间是有限的)。

        无论是malloc、calloc、realloc,他们都可以进行内存申请,但返回值皆为void,原因就算其返回值为地址!地址!地址!,所以内存申请时要进行类型转换。(前文提到过数据类型=内存长度+解析方式,后面的文章将会讲到为什么是void类型)

char* str1 = (char*) malloc(10*sizeof(int));
char* str2 = (char*) calloc(10,sizeof(int));
char* str3 = (char*) ralloc(shr1,15*sizeof(int));//改变申请内存空间大小

        我们可以看到,堆是不是很灵活,但也就是这个内存申请于释放均要由人进行管理,所以也就存在做多错多的现象,经常就算申请了内存没释放还反复申请,小程序还好(程序生命周期结束,所有内存全释放了),到了大一些的程序特别是嵌入式,这些问题就会暴露出来(吃内存造成内存泄漏)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值