C语音中的堆和栈
2019-06-27 本文已影响0人
一叶知秋0830
说起堆和栈,很多人的第一反应就是2种数据结构,栈是一种具有后进先出特性的数据结构,堆是一种树形数据结构。不过我这里要说的是内存分配中的栈空间和堆空间。
1.栈空间
栈是系统自动分配空间的,也是由系统自动回收的。当我们执行一个函数时,操作系统会分配一小段栈空间,先将参数压入栈中,然后将函数中定义的局部变量压入栈中,当函数执行结束时,局部变量先出栈,然后参数出栈,然后这段栈空间会被系统回收掉。这也是为什么函数局部变量在函数外部不能访问的原因。一般系统分配的栈空间很小,只有几兆。
2.堆空间
堆空间是程序员自己向系统申请分配的空间,堆空间是很大的,有几个G,所以要分配一大段空间的话都是从堆空间分配。一个函数中如果申请了一段堆空间,即使函数执行结束,外部依然可以访问这个堆空间。比如我们要申请一段堆空间来存放一个int类型的变量,可以这样写,int *a; a=(int*)malloc(sizeof(int));
申请的堆空间大小是sizeof(int),也就是int类型数据的大小,a是一个指针,它指向这个堆空间,函数外部可以通过指针a访问这个堆空间。我们程序中的指针一般都是指向堆空间。
申请堆空间后,当不需要再使用这段空间时一定要主动释放,系统不会自动释放,不主动释放的话就会造成内存泄露。