我们再了解内存的分配情况前,首先我们需要了解代码及其中的东西,在内存中都是怎么存放的。我们首先来看一个示意图。
这张图片展示的就是代码在存储区的存储状况,最上面是代码段,代码段就是用来保存代码的文本文档的。全局变量区就是用来保存全局变量和静态变量的,所有的全局变量都在这一部分。而栈是用来保存局部变量的,栈里面保存的变量申请以后由操作系统来负责释放,而与之相对应的是堆,申请堆里面的内存,称为动态内存分配。堆比较大但是它里面的变量不是由操作系统来管理的,而是可以自由申请的,但是申请以后是必须释放的,如果不释放,就会造成内存泄漏,内存泄漏是一个比较严重的问题,会使内存越来越少,设备越来越卡顿 ,所以在用动态内存分配的时候,需要特别的注意。
对内存动态的分配,是使用库函数里面的函数来实现的。主要由malloc,calloc,realloc,free这4个函数。因为我们在声明部分没有定义它们为变量或者是数组,因此我们不能通过你函数名来引用它们,只能通过指针来引用。
1.mallco函数
mallco函数的原型为void * malloc(unsigned int size)
函数malloc的形参为无符号的整形,因为size表示的就是需分配长度为size的连续空间,地址是没有负数的,因此使用unsigned类型,函数的返回值是分配的地址空间的首地址,此函数是一个函数指针,因此返回的指针指向该分配区域的开头位置,如果申请失败,则返回的是空指针NULL。
2.calloc函数
calloc函数是用来分配n个长度为size的连续空间,其函数原型为void * calloc(unsiged n,unsiged size)其中。该函数还可以为一维数组开辟动态存储空间,n为数组元素的个数,size为每个数组元素的大小。如果分配成功,则返回分配的首地址,分配失败返回空指针。例如 p=calloc(50,4)表示的就是分配50个大小为4字节的连续区域。
3.realloc函数
realloc函数是用来改变已分配的动态内存空间的大小的,其函数原型为void * recalloc(void *p,unsiged int size),表示将p所指向的内存空间大小改为size。
4.free函数
free函数是用来释放已经动态分配的内存。以供其他变量来使用。其函数原型为void * free(void *p),表示的就是释放申请的p的内存。free函数没有返回值。如free ( p )表示的就是释放p的空间。